偶尔我们会向我们的潜在客户发送自定义注册链接。该链接包含的参数可用于预先填写注册表单。
http://www.example.com/users/sign_up?user[company_name]=Foo&user[region]=NA
我们的注册表包含接受公司名称和地区的字段。可以根据注册链接预先填写。
这应该在实践中有效,但由于registrations#new
操作的实施方式,它并不存在。 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
操作中)?
答案 0 :(得分: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.region = params[:user][:region]
end
end
答案 1 :(得分:0)
我认为这是build_resource
方法的预期行为。与Model.new
类似,您可以传递初始化属性的哈希值,也可以不传递任何内容,从而分别生成预填充模型和空模型。
如果你想让你的控制器动作更明确,你可以调用build_resource(params[:user])
来避免你担心的脆弱。