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

时间:2011-09-19 07:56:44

标签: ruby-on-rails

在rails中是否有一个简洁的方法来获取没有默认的'action'和'controller'的params的哈希值?基本上没有任何未被我添加的参数。

我已经安定下来了:

parm = params.clone
parm.delete('action')
parm.delete('controller');

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

5 个答案:

答案 0 :(得分:39)

您可以使用except:

params.except(:action, :controller)

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

答案 1 :(得分:22)

request.path_parameters

返回path_parameters

request.query_parameters

返回request_parameters

你正在寻找后者。

答案 2 :(得分: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

如您所见,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)

答案 3 :(得分:4)

使用

request.request_parameters

它排除了path_parameters(控制器和操作)

答案 4 :(得分:1)

我用

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"}}

上面的代码行避免了这种情况。