【发布时间】:2011-11-20 00:58:23
【问题描述】:
rails 中是否有一种简洁的方法来获取参数的哈希值,而不需要默认的“action”和“controller”?基本上没有任何不是我添加的参数。
我已经解决了:
parm = params.clone
parm.delete('action')
parm.delete('controller');
但是想知道是否有更简洁的方法可以做到这一点?
【问题讨论】:
标签: ruby-on-rails
rails 中是否有一种简洁的方法来获取参数的哈希值,而不需要默认的“action”和“controller”?基本上没有任何不是我添加的参数。
我已经解决了:
parm = params.clone
parm.delete('action')
parm.delete('controller');
但是想知道是否有更简洁的方法可以做到这一点?
【问题讨论】:
标签: ruby-on-rails
你可以使用除了:
params.except(:action, :controller)
http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Except.html
【讨论】:
params.except(:action, :controller)。它更干净;)
params 可以有不同的名称/字段数量,但我只想要表单输入字段中的所有数据,不包括utf-8、auth_token 等,所以这有助于尽我所能告诉
request.path_parameters
返回路径参数
request.query_parameters
返回请求参数
你正在寻找后者。
【讨论】:
request.request_parameters 的存在并澄清request.query_parameters 返回的内容。
如果您在控制器中工作,您还应该有权访问请求对象。
长话短说,rails 和 rack 整理传入的 GET/POST 请求(表单、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。
请注意:如果您需要对哈希进行编码并且需要以字符串或符号的形式访问键,则使用 : 可能会更好。参数方法的最后一行为您处理:
encode_params(params).with_indifferent_access
使用 except 并确保您删除所有 rails 非请求参数的替代方法:
path_params = request.path_parameters
params.except(*path_params.keys)
【讨论】:
request.query_parameters 可能是 OP 真正想要的。
使用
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
使用来自网络表单的以下发布值:
{email: 'test@example.com', password: 'password123'}
控制台输出将是:
{"email"=>"test@example.com", "password"=>"password123", "session"=>{"email"=>"test@example.com", "password"=>"password123"}}
上面的代码行避免了这种情况。
【讨论】: