【问题标题】:How to give a form parameter a name in rails form?如何以rails形式为表单参数命名?
【发布时间】:2020-08-22 08:11:16
【问题描述】:

我有一个带有几个单选按钮的表单。它提交的参数是一个哈希数组。在服务器日志中,哈希数组似乎没有名称(可能是因为我需要给它一个名称)。因此,我不能告诉params.require(:availability).permit(:<HERE>) 允许它,因为我不知道在.permit() 中输入什么名称。

我尝试修改私有控制器方法确实放宽了那里的要求,但我认为这是一个 hack 而不是一个好的解决方案。

这是我在视图中生成哈希数组的代码

<%= form_tag("/availabilities/") do |f| %> 
<%= label_tag :availability %>
<% @hours.each do |hour| %>  
<%= hour[:time_slot] %>
<%= radio_button_tag hour.to_s, available_in_words(hour[:time_slot_available?]) %>
<%= radio_button_tag hour.to_s, available_in_words(!hour[:time_slot_available?]) %></br>
<% end %> <!-- ends hour loop --> 

<div><%= submit_tag 'Save' %></div>
<% end %> <!-- ends form --> 

注意:通过此表单提交的内容Availability 模型中的字段匹配 - 它更原始,需要在提交后进行工作,然后才能在可用性中创建/更新记录。我不确定这是否会影响事情

到目前为止我所知道的

我以为label_tag 会给表单参数一个名称,通过它可以在params.require(:availability) 中引用它,但这会导致错误param is missing or the value is empty: availability

注意

这是params提交后的样子:

<ActionController::Parameters {"authenticity_token"=>"KEuNcLzuAcQj6b+0oQ0FzjOE35f1Xq3MNNomzTnC9SCML9kaWVIFgphCgDRy5cHowxQ/N4kodNIXYCAwtCPGnA==", "{:time_slot=>2020-08-22 18:00:00 +1000, :time_slot_available?=>false}"=>"Unavailable", "{:time_slot=>2020-08-22 20:00:00 +1000, :time_slot_available?=>false}"=>"Available", "commit"=>"Save", "controller"=>"availabilities", "action"=>"create"} permitted: false>

访问“authenticity_token”非常简单:params[:authenticity_token]。但我无法从单选按钮有意义地访问输入

【问题讨论】:

  • @jvillian 是的,我做到了。每当我完成这个应用程序(可能是 2027 年)时,您对堆栈溢出的响应将有 90%,而我的一些 cmets 将它们全部加入 :)
  • @jvillian 基本上,当我提交数组时,它会通过(可以在日志中看到),但它没有名称,所以我不能在创建控制器的动作
  • @jvillian 我已经研究过如何通过索引访问参数(我认为没有办法),显然不赞成像哈希一样处理一组参数,所以我修改了在那里,但从那种方法继续前进
  • radio_button_tag 方法的行为与docs 中指定的一样。我建议您将 desired 参数添加到您的问题中,然后我们可以从那里向后工作。
  • 谢谢@jvillian 我绝对可以做到。 TBH 我很高兴能够以任何方式访问哈希数组(最好是最佳实践,但可能没有 Rails 方式)。基本上我在寻找一些数据结构,其中包含每个时间段的真/假信息(用户通过表单一次提交所有信息)

标签: ruby-on-rails


【解决方案1】:

名称是几乎所有 FormTagHelper 方法的第一个参数。

radio_button_tag(name, value, checked = false, options = {})

https://api.rubyonrails.org/v5.1.7/classes/ActionView/Helpers/FormTagHelper.html#method-i-radio_button_tag

在 Rack(Rails 位于其之上)中,您可以使用括号将哈希值传递给参数:

foo[bar][a]=1&foo[bar][b]=2

将导致:

{
  foo: {
    bar: {
      a: 1,
      b: 2
    }
  }
}

您可以通过将哈希传递给 .permit 来将嵌套哈希列入白名单:

params.require(:foo).permit(bar: [:a, :b])

您可以使用空括号将数组传递给参数:

foo[bar][]=1&foo[bar][]=2

这将导致:

{
   foo: {
     bar: [1,2]
   }
}

然后您可以通过以下方式将数组列入白名单:

params.require(:foo).permit(bar: [])

[] 将允许permitted scalar values 的数组。

我不确定 @hour.to_s 返回的确切内容,但您可能需要确保它确实适合用作 formdata 键/值对中的键,并且不会与 Rack 的参数解析器混淆。

【讨论】:

  • 这么全面的答案! @hour.to_s 从 1970 年 1 月 1 日开始以字符串形式返回秒数(必须给它起个名字,这似乎信息丰富且不太冗长)
  • 是的,这真的很难列入白名单,因为它只会创建一堆“根”键,而您事先无法知道它们的键。
  • 我一直在努力解决这个问题,并且想了很多。我的下一个想法是简单地params(而不是强参数,我不太了解,因此不会使用)。所以我目前正在探索/尝试的是使用accepts_nested_attributes_for 同一模型的多个记录。我敢说今晚晚些时候会有一个关于它的问题。
  • 您可以将它们放在一个带有"radio_button_tag(hours[#{@hour}]", ... 的哈希中,然后在提取参数时使用params[:hours].permit! 以允许整个哈希。
猜你喜欢
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
相关资源
最近更新 更多