嵌套模型在Devise视图中不可用

时间:2011-05-15 01:34:35

标签: ruby-on-rails-3 devise nested-forms

我的观点中没有可用的关联问题。

我的模特是:

: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

那里的debug语句确认已成功创建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

是否有一些我遗漏的东西,或者说Devise使用的resource机制是否存在一些奇怪的东西阻止了视图中的关联?

谢谢!

编辑: 如果我只是在退出表单之前在我的视图中添加resource.subscriptions.build,那就可以了。但我认为这种逻辑属于控制器而不是视图,我想知道是什么让我无法将它放在那里。

1 个答案:

答案 0 :(得分:4)

这个答案真的很晚了,但是我发现如果我覆盖整个控制器动作“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

应该很好地工作......至少它对我有用。无论如何,你的代码让我开始走上正轨。