【问题标题】:Getting the rails 'params' without the defaults?在没有默认值的情况下获取 rails 'params'?
【发布时间】:2011-11-20 00:58:23
【问题描述】:

rails 中是否有一种简洁的方法来获取参数的哈希值,而不需要默认的“action”和“controller”?基本上没有任何不是我添加的参数。

我已经解决了:

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

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

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    你可以使用除了:

    params.except(:action, :controller)
    

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

    【讨论】:

    • 哦,太好了!我不知道那个,但我认为你会以这种方式使用它:params.except(:action, :controller)。它更干净;)
    • 不错的一个。我不认为这个数组在任何地方都被定义为常量?那么它会甚至更整洁,并且面向未来!
    • @Matt Dressel 的回答要安全得多。
    • @aceofspades 这个答案回答了排除各种参数的更一般的问题。在我的情况下,我的params 可以有不同的名称/字段数量,但我只想要表单输入字段中的所有数据,不包括utf-8、auth_token 等,所以这有助于尽我所能告诉
    【解决方案2】:
    request.path_parameters
    

    返回路径参数

    request.query_parameters
    

    返回请求参数

    你正在寻找后者。

    【讨论】:

    • 这是真正的答案!
    • 这是否也会排除 "utf-8" 和 "auth_token" 之类的内容?我正在寻找一种方法来简单地从 POST 提交的表单输入字段中获取所有值
    • @mmcrae -- 会的
    • 这是误导。 request.query_parameters != request.request_parameters。 request_parameters 包括也显示在 query_parameters 中的 url 参数,但是 query_parameters 不包括仅显示在 request_parameters 中的 POST 变量(即表单变量)。
    • 我同意@Emeka 的观点,即这个答案应该提到request.request_parameters 的存在并澄清request.query_parameters 返回的内容。
    【解决方案3】:

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

    长话短说,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)
    

    【讨论】:

    • 感谢您的出色详细回答。比 :except 选项更具前瞻性,并且非常有用。
    • request.query_parameters 可能是 OP 真正想要的。
    • 我们肯定需要更多这样的答案。谢谢马特。
    【解决方案4】:

    使用

    request.request_parameters
    

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

    【讨论】:

      【解决方案5】:

      我用

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-13
        • 2019-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-26
        • 1970-01-01
        相关资源
        最近更新 更多