Ruby on Rail:为设计用户添加多态地址

时间:2011-10-13 21:16:30

标签: ruby-on-rails devise polymorphic-associations

ROR新手在这里。 : - )

我正在使用Devise进行身份验证,并将first_name和last_name添加到由devise创建的User模型中。我还创建了地址模型:

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 


视图/ shared / _address.html.erb

的部分内容


  

  


  

  


  

  


  


user.rb

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

accepts_nested_attributes_for:address,:update_only =>真

在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上,也不会编辑。

请分享你的智慧。提前致谢。

1 个答案:

答案 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