Вложенная модель недоступна в представлениях Devise - PullRequest
0 голосов
/ 15 мая 2011

У меня проблема с ассоциациями, недоступными в моих представлениях.

Мои модели:

:user has_many :subscriptions
:subscription belongs_to :user

Я использую Devise для управления аутентификацией и т. Д. Для пользователей

Что я хотел бы сделать: при создании нового пользователя в процессе регистрации я также хочу создать подписку для этого пользователя.Поскольку Devise::RegistrationsController#new по умолчанию не инициализирует связанную подписку, я создал собственную RegistrationsController:

class RegistrationsController < Devise::RegistrationsController
  def new
    super
    resource.subscriptions.build
    logger.debug resource.subscriptions.inspect
  end
end

Оператор отладки подтверждает, что объект Subscription успешно создан:

[#<Subscription id: nil, user_id: nil, chargify_subscription_id: nil, chargify_product_handle: nil, created_at: nil, updated_at: nil>]

Проблема: в представлении resource.subscriptions не существует.Если я проверю resource в представлении, я получу объект User, который включает в себя все свои собственные атрибуты, но не имеет ассоциаций (с ним должно быть связано subscriptions)

debug(resource), что дает следующее:

--- !ruby/object:User
attributes:
  name:
  encrypted_password: ""
  created_at:
  updated_at:
  last_sign_in_ip:
  last_sign_in_at:
  sign_in_count: 0      last_name:
  current_sign_in_ip:
  reset_password_token:
  current_sign_in_at:
  remember_created_at:
  reset_password_sent_at:
  chargify_customer_reference:
  first_name:
  email: ""
attributes_cache: {}

changed_attributes: {}

destroyed: false
marked_for_destruction: false
new_record: true
previously_changed: {}

readonly: false

Есть ли что-то, чего мне не хватает, или, может быть, есть что-то странное в механизме resource, используемом Devise, который препятствует доступу ассоциаций в представлении?

Спасибо!

Редактировать: если я просто добавлю resource.subscriptions.build в моем представлении, прежде чем переписать форму, это будет работать нормально.Но я думаю, что такая логика принадлежит контроллеру, а не представлению, и я хотел бы знать, что удерживает меня от возможности поместить ее туда.

1 Ответ

4 голосов
/ 09 ноября 2011

Этот ответ действительно опоздал, но я обнаружил, что если я переопределю все действие контроллера «new» (вместо того, чтобы делегировать часть из него родительскому элементу с помощью «super»), то я смогу правильно построить ресурс.Причина в том, что «super» визуализирует представление перед передачей управления обратно в ваш собственный метод контроллера.Короче говоря ...

class RegistrationsController < Devise::RegistrationsController
  def new
    resource = build_resource({})  # as found in Devise::RegistrationsController
    resource.subscriptions.build
    respond_with_navigational(resource){ render_with_scope :new } # also from Devise
  end
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...