4

有时,我们会向我们的潜在客户发送定制的注册链接。该链接包含可用于预先填写注册表单的参数。

http://www.example.com/users/sign_up?user[company_name]=Foo&user[region]=NA

我们的注册表有接受公司名称和地区的字段。可以根据注册链接预先填写。

这应该在实践中起作用,但这与registrations#new操作的实施方式无关。新操作使用空哈希调用该 方法。build_resource

def new
  resource = build_resource({})
  respond_with resource
end

build_resource方法在输入非零时忽略。resource_params

def build_resource(hash=nil)
  hash ||= resource_params || {}
  self.resource = resource_class.new_with_session(hash, session)
end  

我不得不覆盖new注册控制器中的操作来克服这个问题。我不喜欢我的解决方案,因为它很脆弱。

def new
  resource = build_resource
  respond_with resource
end

是否有理由new使用空哈希调用该操作?可以在没有空哈希的情况下调用它(就像在create操作中一样)?

4

2 回答 2

1

我最终覆盖build_resource并确定了对new行动的改变。

def build_resource(hash=nil)
  # scope the change to new actions 
  return super unless action_name == "new"
  super.tap do |user|
    user.company_name = params[:user][:company_name]
    user.reg‭ion = params[:user][:reg‭ion]      
  end
end
于 2015-06-12T21:34:55.597 回答
0

我相信这是该build_resource方法的预期行为。与您类似,Model.new您可以传递初始化属性的哈希值,也可以不传递任何内容,从而分别生成预填充模型和空模型。

如果你想让你的控制器动作更明确,你可以改为调用build_resource(params[:user])which 应该避免你担心的脆弱性。

于 2013-10-26T11:06:11.663 回答