能否将params作为ActionController::Parameters对象转发到表单hidden_field中



用户在索引页中应用过滤器,我需要过滤器的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而不存在时,会导致视图中出现错误。

有没有什么方法可以实现这一点,或者在params哈希作为字符串传递后重新生成它?

您可以使用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(&。密钥

最新更新