ROR新手在这里。 : - )
create_table:地址do | t | t.string:line1 t.string:line2 t.string:city t.string:state t.integer:addressable_id t.string:addressable_type
t.timestamps
end
add_index :addresses, [:addressable_type, :addressable_id], :unique => true
端
has_one:address,:as => :寻址
#包括默认设计模块。其他可用的是: #:token_authenticatable,:encryptable,:confirmmable,:lockable,:timeoutable和:omniauthable 设计:database_authenticatable,:registerable, :可恢复的,:可记住的,:可跟踪的,:有效的
#为您的模型设置可访问(或受保护)属性 attr_accessible:email,:password,:password_confirmation,:remember_me,:firstname,:lastname attr_accessible:address_attributes
在views / devise / registrations / new.html.erb和edit.html.erb
中添加了以下行<%f.fields_for:地址do |地址|%> <%= render:partial => 'shared / address',:locals => {:f =>地址}%GT;
<%end%>
<%end%>
<%f.fields_for:地址do |地址|%> <%= render:partial => 'shared / address',:locals => {:f =>地址}%GT;
<%end%>
<%end%>
现在我想让Devise在新用户注册时创建一个地址。并且用户可以在登录后填写地址。显然缺少某些东西或者我做错了。地址字段不会显示在sign_up上,也不会编辑。
请分享你的智慧。提前致谢。
答案 0 :(得分:2)
fields_for的一般行为是关联对象不会在表单中显示,除非它已经存在。例如。如果我们在Devise的上下文之外发言,那么为了让地址显示在新的用户表单上,你会有类似的东西:
# users_controller.rb
def new
@user = User.new
@user.address = Address.new
end
然后地址将显示在表单上。
鉴于这是一个由Devise管理的表单,并且您无法直接访问必要的控制器,我猜最好的办法是使用ActiveRecord回调来实例化一个地址(如果它已经不存在) 。例如。
之类的东西# user.rb
after_initialize :create_address
def create_address
self.address = Address.new if self.address.nil?
end