我的观点中没有可用的关联问题。
我的模特是:
: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
,那就可以了。但我认为这种逻辑属于控制器而不是视图,我想知道是什么让我无法将它放在那里。
答案 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
应该很好地工作......至少它对我有用。无论如何,你的代码让我开始走上正轨。