Как создать связанные записи до того, как класс "tenant" будет сохранен с помощью activ_as_tenant gem?

Пример...

У меня есть класс под названием client который мой tenant модель.
Я связал записи, чтобы сохранить вместе с каждым новым client это создается. Давайте назовем их tasks,
Я создал after_initialize обратный вызов внутри client который вызывает метод с именем build_defaults который делает следующее...

def build_defaults
self.tasks.build(
  Task.new({
    :name => 'task 1',
    :description => 'task 1 desc',
    :view_module => 'task_1_template'
  }),
  Task.new({
    :name => 'task 2',
    :description => 'task 2 desc',
    :view_module => 'task_2_template'
  }),
  Task.new({
    :name => 'task 3',
    :description => 'task 3 desc',
    :view_module => 'task_3_template'
  }),
  Task.new({
    :name => 'task 4',
    :description => 'task 4 desc',
    :view_module => 'task_4_template'
  }),
  Task.new({
    :name => 'task 5',
    :description => 'task 5 desc',
    :view_module => 'task_5_template'
  })
)
end

task класс настроен как acts_as_tenant :client

Когда я иду делать @client = new Client( :name => "Test Client" )Это поднимает ActsAsTenant::Errors::NoTenantSet: ActsAsTenant::Errors::NoTenantSet

Есть ли способ условно обойти проверку act_as_tenant, когда это new_record? или лучший способ справиться с этим типом вещи?

Я довольно новичок в rails / ruby ​​несколько месяцев назад...?

ОБНОВИТЬ

Ну, я понял, если я изменю его на "after_create" и установил ActsAsTenant.current_tenant = self в рамках метода, который я могу сделать self.tasks.create! звонки... но не уверены, что переопределение ActsAsTenant.current_tenant - хорошая идея?

  after_create :build_defaults
  def build_defaults
    ActsAsTenant.current_tenant = self
    self.tasks.create!({
      :name => 'Facebook > Page Like',
      :description => 'Request that they like your page.',
      :view_module => 'facebook_page_like'
    })
    self.tasks.create!({
      :name => 'Facebook > Share',
      :description => 'Share a link on Facebook',
      :view_module => 'facebook_share_link'
    })
    self.tasks.create!({
      :name => 'Twitter > Tweet',
      :description => 'Post a tweet on a user behalf.',
      :view_module => 'twitter_tweet'
    })
    self.tasks.create!({
      :name => 'Twitter > Follow',
      :description => 'Follow the company twitter user.',
      :view_module => 'twitter_follow'
    })
    self.tasks.create!({
      :name => 'Giveaway Share',
      :description => 'This allows you to earn 5 extra entries by re-sharing this giveaway.',
      :view_module => 'giveaway_share'
    })
  end

1 ответ

Решение

Если вы создаете нового арендатора, а затем хотите создать ряд записей, связанных с новым клиентом, вам сначала нужно будет установить текущего арендатора, или действие Act_as_tenant не позволит вам сделать это.

Ваш подход работает, но для arguments_as_tenant также есть специальный API для этого (также проверьте прочитанное мной):

Установка текущего арендатора для блока

ActsAsTenant.with_tenant(newly_created_tenant) do
  # Current tenant is set for all code in this block
end

Это работает.

Однако, если вы хотите предоставить новому арендатору прямой доступ к его приложению после создания его учетной записи. Вы бы лучше войти в него и затем создать значения по умолчанию. Способ входа в него зависит от вашего решения для аутентификации.

Другие вопросы по тегам