在没有默认值的情况下获得rails'params'?

Wil*_*iss 24 ruby-on-rails

在rails中是否有一种巧妙的方法来获取params的哈希,而没有默认的'action'和'controller'?基本上没有任何我没有添加的参数.

我已经解决了:

parm = params.clone
parm.delete('action')
parm.delete('controller');
Run Code Online (Sandbox Code Playgroud)

但想知道是否有更简洁的方法来做到这一点?

小智 42

你可以使用除了:

params.except(:action, :controller)
Run Code Online (Sandbox Code Playgroud)

http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Except.html

  • 不错哦!我不知道那个,但我认为你会以这种方式使用它:`params.except(:action,:controller)`.它更清洁;) (2认同)

gr8*_*t06 24

request.path_parameters
Run Code Online (Sandbox Code Playgroud)

返回path_parameters

request.query_parameters
Run Code Online (Sandbox Code Playgroud)

返回request_parameters

你正在寻找后者.

  • 这是真正的*答案! (3认同)
  • 这是误导。request.query_parameters!= request.request_parameters。request_parameters包含也显示在query_parameters中的url参数,但是query_parameters不包括仅显示在request_parameters中的POST变量(即,表单变量)。 (2认同)

Mat*_*sel 21

如果您在控制器中工作,您还应该有权访问请求对象.

总而言之,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
Run Code Online (Sandbox Code Playgroud)

如您所见,params是参数方法的别名,它是两个子哈希的合并哈希值:request_parameterspath_parameters.

在您的情况下,您不需要path_parameters.您可以通过:request.request_parameters访问数据,而不是使用except来强制您知道要排除哪些路径参数.

需要注意的一点是:您可能最好使用:除非您需要对哈希进行编码并将密钥作为字符串或符号进行访问.参数方法的最后一行为您处理:

encode_params(params).with_indifferent_access
Run Code Online (Sandbox Code Playgroud)

使用except并确保删除所有rails非请求参数的替代方法:

path_params = request.path_parameters
params.except(*path_params.keys)
Run Code Online (Sandbox Code Playgroud)

  • `request.query_parameters`可能是OP实际上正在寻找的东西. (5认同)

Nan*_*488 5

request.request_parameters
Run Code Online (Sandbox Code Playgroud)

它不包括 path_parameters(控制器和动作)