首页 文章

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

提问于
浏览
2

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

结束


a views at views / shared / _address.html.erb


user.rb

has_one:address,:as =>:可寻址

#包括默认设计模块 . 其他可用的是:#:token_authenticatable,:encryptable,:confirmable,:lockable,:timeoutable和:omniauthable devise:database_authenticatable,:registerable,:recoverable,:rememberable,:trackable,:validatable

#为您的模型设置可访问(或受保护)属性attr_accessible:email,:password,:password_confirmation,:remember_me,:firstname,:lastname attr_accessible:address_attributes

accepts_nested_attributes_for:address,:update_only => true

在views / devise / registrations / new.html.erb和edit.html.erb中添加了以下行


<%f.fields_for:地址do |地址|%> <%=渲染:部分=>'共享/地址',:locals => {:f =>地址}%>

<%end%>

<%end%>


<%f.fields_for:地址do |地址|%> <%=渲染:部分=>'共享/地址',:locals => {:f =>地址}%>

<%end%>

<%end%>


现在我想让Devise在新用户注册时创建一个地址 . 并且用户可以在登录后填写地址 . 显然缺少某些东西或者我做错了 . 地址字段不会显示在sign_up或编辑 .

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

1 回答

  • 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
    

相关问题