【问题标题】:Can you forward params as an ActionController::Parameters object in a forms hidden_field?您可以在表单 hidden_​​field 中将参数作为 ActionController::Parameters 对象转发吗?
【发布时间】:2021-09-28 00:45:42
【问题描述】:

用户在索引页面中应用过滤器,我需要过滤器的params 来做一些后台工作。

在应用过滤器后,我可以像往常一样访问参数,但是当我尝试将 request.params 转发到启动后台作业的控制器操作时,表单中传递的参数 hidden_field 不再是一个ActionController::Parameters 对象,而是一个String,我无法像通常通过它的键那样访问它。

表格:

          <%= form_tag admin_users_on_demand_mass_emails_path, method: :get do %>
            <%= simple_fields_for :on_demand_email do |f| %>
              <%= hidden_field_tag :filters, params[:q].to_unsafe_h %>
                <%= f.input :email,
                as: :radio_buttons,
                collection: options_for_on_demand_emails %>
            <% end %>
            <%= submit_tag "Enviar emails", class: "btn btn-primary" %>
          <% end %>

表单发送前的参数:

<ActionController::Parameters {"q"=><ActionController::Parameters {"fname_or_lname_or_email_or_tax_id_number_or_legal_name_cont"=>"", "extra_params"=><ActionController::Parameters {"invoice_status"=>""} permitted: false>, "subscription_payment_type_eq"=>"", "address_province_eq"=>"", "subscription_status_eq"=>"cancelled", "created_at_gteq"=>"", "created_at_lteq"=>""} permitted: false>, "subscription_status_eq"=>"{}", "commit"=>"Filter", "controller"=>"admin/users", "action"=>"index"} permitted: false>

变成:

{"filters"=>
  "{\"fname_or_lname_or_email_or_tax_id_number_or_legal_name_cont\"=>\"\", \"extra_params\"=>{\"invoice_status\"=>\"\"}, \"subscription_payment_type_eq\"=>\"\", \"address_province_eq\"=>\"\", \"subscription_status_eq\"=>\"cancelled\", \"created_at_gteq\"=>\"\", \"created_at_lteq\"=>\"\"}",
 "on_demand_email"=>"[FILTERED]",
 "commit"=>"Send emails"}

我尝试了许多不同的方法,例如传递request.params.to_unsafe_h(相同的结果)和params.require(:q).permit(params[:q].keys),当:q 由于require 而不存在时,这会导致视图中出现错误。

有没有什么方法可以完成此操作或在将参数哈希作为字符串传递后重建它?

【问题讨论】:

    标签: html ruby-on-rails parameters simple-form


    【解决方案1】:

    您可以使用JSON.parse() 将它们转换为如下所示的哈希,

    {"filters"=>
      JSON.parse("{\"fname_or_lname_or_email_or_tax_id_number_or_legal_name_cont\"=>\"\", \"extra_params\"=>{\"invoice_status\"=>\"\"}, \"subscription_payment_type_eq\"=>\"\", \"address_province_eq\"=>\"\", \"subscription_status_eq\"=>\"cancelled\", \"created_at_gteq\"=>\"\", \"created_at_lteq\"=>\"\"}"),
     "on_demand_email"=>"[FILTERED]",
     "commit"=>"Send emails"}
    

    【讨论】:

    • 谢谢。最后我做了params.permit(q: params.dig(:q)&amp;.keys
    【解决方案2】:

    最后我做了 params.permit(q: params.dig(:q)&.keys

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 2018-08-04
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多