【问题标题】:Access params with wildcard in Rails在 Rails 中使用通配符访问参数
【发布时间】:2019-11-19 23:48:22
【问题描述】:

目前我有一个 form_tag,其中包含输入并将这些输入放入参数中。 我希望能够在控制器操作中循环它们。

我尝试获取所有params,不包括所有常见的params(动作、控制器、模型名称等),然后使用params[:prop*]之类的通配符。

这是有问题的表单输入:

%input{:name => "userEmails", :id =>"userEmails", :type => "hidden", :value => ""}
  -@all_properties.each do |prop|
    %input{:name => "prop"+prop.name+"checkbox", :type => "checkbox", :id => "prop"+prop.name+"checkbox"}
    #{prop.name}
    %input{:name => "prop"+prop.name, :type => "text", :id => "prop"+prop.name}

这些显示在{"propProperty1checkbox"=>"on", "propProperty1" => "testing", "propAnotherPropertycheckbox" => "on", "propAnotherProperty" => "another test value"} 等参数中。

我不确定如何访问它们,因为属性的名称可能会更改,因此需要抽象地访问。

【问题讨论】:

    标签: ruby-on-rails ruby forms post parameters


    【解决方案1】:

    您可以在 params 哈希上使用 #select 来仅过滤您感兴趣的参数:

    params = {"user_id"=>1, 
     "propProperty1checkbox"=>"on",                                                                                   
     "propProperty1"=>"testing",                                                                                      
     "propAnotherPropertycheckbox"=>"on",                                                                             
     "propAnotherProperty"=>"another test value"
    }
    params.to_h.select{|key, value| key =~ /^prop/}
    #=> {"propProperty1checkbox"=>"on",
    #"propProperty1"=>"testing",
    #"propAnotherPropertycheckbox"=>"on",
    #"propAnotherProperty"=>"another test value"}
    

    编辑

    评论示例:

    [13] pry(main)> {"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"xxxxx", "userEmails"=>"teste@test.com,test2@test.com,test4@test.com,fasd@gmail.com", "propProperty1checkbox"=>"on", "propProperty1"=>"3", "propAnotherPropertycheckbox"=>"on", "propAnotherProperty"=>"4", "commit"=>"Submit", "Application"=>"8", "Company"=>"1" }.to_h.select{|k, v| k =~ /^prop/}
    => {"propProperty1checkbox"=>"on",
     "propProperty1"=>"3",
     "propAnotherPropertycheckbox"=>"on",
     "propAnotherProperty"=>"4"}
    

    【讨论】:

    • 感谢您的建议,不幸的是它似乎对我不起作用。运行params.to_h.select{|key, value| key =~ /^prop/} 没有任何回报
    • 可以发一下params的内容吗?
    • {"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"xxxxx", "userEmails"=>"teste@test.com,test2@test.com,test4@test.com,fasd@gmail.com", "propProperty1checkbox"=>"on", "propProperty1"=>"3", "propAnotherPropertycheckbox"=>"on", "propAnotherProperty"=>"4", "commit"=>"Submit", "Application"=>"8", "Company"=>"1" }
    • 这很有趣。我同意它在一次运行时可以工作{"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"xxxxx", "userEmails"=>"teste@test.com,test2@test.com,test4@test.com,fasd@gmail.com", "propProperty1checkbox"=>"on", "propProperty1"=>"3", "propAnotherPropertycheckbox"=>"on", "propAnotherProperty"=>"4", "commit"=>"Submit", "Application"=>"8", "Company"=>"1" }.to_h.select{|k, v| k =~ /^prop/} 但是,当尝试直接从参数运行它时,由于某种原因它似乎不起作用
    • 试试{|key, value| key.to_s =~ /^prop/}
    【解决方案2】:

    你可以试试这样的:

    input(name: "props[#{pro_name}][checkbox]"...)
    input(name: "props[#{pro_name}][text]"...)
    

    然后,在您的控制器中:

    def method
      props = params[:props]
      props.each do |property_name, values|
        chk = values[:checkbox]
        text = values[:text]
      end
    end
    

    【讨论】:

    • 感谢您的建议,我现在已将代码编辑为 -@all_properties.each do |prop| %input{:name => "prop[prop.name][checkbox]", :type => "checkbox", :id => "prop"+prop.name+"checkbox"} #{prop.name} %input{:name => "prop[prop.name][text]", :type => "text", :id => "prop"+prop.name} 发布表单时,我的 params[:prop] 似乎只存储最后输入的数据,例如 "prop"=>{"prop.name"=>{"checkbox"=>"on", "text"=>"2"}}
    • 你需要文本插值::name => "prop[#{prop.name}][checkbox]"
    猜你喜欢
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2014-01-28
    • 2016-04-11
    相关资源
    最近更新 更多