在sign_up上分配嵌套属性

时间:2014-05-09 07:08:55

标签: ruby-on-rails ruby devise

我有一个具有嵌套位置属性的用户模型。我正在尝试在注册时分配地址。由于他们没有地方放置他们的地址,我想默认使用IP地址。我有位置和IP地理定位工作,但获得设计接受参数是问题。

我已将此添加到我的注册控制器

class Users::RegistrationsController < Devise::RegistrationsController
  private
  def sign_up_params
    params.require(:user).permit(:email, :password, :password_confirmation, location: [ :full_address ]).merge(
        location: { :full_address => request.remote_ip }
    )
  end
end

这是我目前得到的错误 的ActiveRecord :: AssociationTypeMismatch 位置(#85361712)预计,获得ActiveSupport :: HashWithIndifferentAccess(#38238360)

我很确定这只是合并中语法的一个简单问题。我试过了

location: [ :full_address => request.remote_ip ]
[:location][:full_address] => request.remote_ip
params[:location][:full_address] => request.remote_ip

不确定还有什么可以尝试。

2 个答案:

答案 0 :(得分:0)

private
    def sign_up_params
        params[:user][:location_attributes][:full_address] = request.remote_ip
        params.require(:user).permit(:email, :password, :password_confirmation, location_attributes: [ :full_address ])
    end

我决定不合并,这很好。

答案 1 :(得分:0)

另一种方法是使用ActiveRecord中的before_create callback

#app/models/user.rb
Class User < ActiveRecord::Base
   has_one :location
   before_create :set_location

   private

   def set_location
      self.location.build(full_address: request.remote_ip) unless self.location.full_address.present?
   end
end