在没有默认值的情况下获得rails’params’?
在rails中是否有一种简洁的方法来获取params的哈希,而不使用默认的’action’和’controller’? 基本上没有任何我没有添加的参数。
我已经解决了:
parm = params.clone parm.delete('action') parm.delete('controller');
但想知道是否有更简洁的方法来做到这一点?
你可以使用除了:
params.except(:action, :controller)
http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Except.html
如果您在控制器中工作,您还应该有权访问请求对象。
总而言之,rails和rack修改传入的GET / POST请求(form,xml,json)并提取参数,以便开发人员能够以一致的方式访问它们。
ActionDispatch通过以下方式公开了合并的参数列表:
# ActionPack 3.1.8 - action_dispatch/http/parameters.rb # Returns both GET and POST \parameters in a single hash. def parameters @env["action_dispatch.request.parameters"] ||= begin params = request_parameters.merge(query_parameters) params.merge!(path_parameters) encode_params(params).with_indifferent_access end end alias :params :parameters
如您所见,params是参数方法的别名,它是两个子哈希的合并哈希值: request_parameters和path_parameters 。
在您的情况下,您不需要path_parameters。 您可以通过以下方式访问您的数据: request.request_parameters ,而不是使用except,这会强制您知道要排除哪些路径参数。
需要注意的一点是 :您可能最好使用:除非您需要对哈希进行编码并将密钥作为字符串或符号进行访问。 参数方法的最后一行为您处理:
encode_params(params).with_indifferent_access
使用except并确保删除所有rails非请求参数的替代方法:
path_params = request.path_parameters params.except(*path_params.keys)
request.path_parameters
返回path_parameters
request.query_parameters
返回request_parameters
你正在寻找后者。
使用
request.request_parameters
它排除了path_parameters(控制器和动作)
我用
request.request_parameters.except(controller_name.singularize)
这将剥离以活动控制器命名的嵌套对象。 例如,使用以下控制器:
Class SessionController > ActionController::Base def create User.find_by(params[:email]).login(password: params[:password]) puts request.request_parameters end end
使用以下Web表单的发布值:
{email: 'test@example.com', password: 'password123'}
控制台输出将是:
{"email"=>"test@example.com", "password"=>"password123", "session"=>{"email"=>"test@example.com", "password"=>"password123"}}
上面的代码行避免了这种情况。