难以构建Rails表单以所需格式返回参数

问题描述

我正在尝试创建一个表单,用户可以在其中将票证添加到其帐户中。票证是分层的(青铜,银,金),我在弄清楚如何获取表格以所需格式输出数据时遇到麻烦。

    <%= form_for(@ticket) do |f|%>
         <%=f.label :tier_gold,"Gold" %>: <br>
         <%=f.number_field :tier%><br>
         <%=f.label :tier_silver,"Silver" %>:<br>
         <%=f.number_field :tier%><br>
         <%=f.label :tier_bronze,"bronze" %>:<br>
         <%=f.number_field :tier%> <br><br>
    <%= f.submit "Get Tickets" %>
    <%end%>

这将输出参数Parameters: {"authenticity_token"=>"xxx","ticket"=>{"tier"=>"5"},"commit"=>"Get Tickets"}

而我希望参数返回与{"authenticity_token"=>"xxx","ticket"=>{"tier"=>{'gold => 1,'silver => 3,'bronze' => 5 },"commit"=>"Get Tickets"}相似的内容

票证模型仅包含属性user_id,raffle_id和tier。

解决方法

您可以尝试以下方法获取所需的参数格式-

<%= form_for(@ticket) do |f| %>
  <%=f.label :tier_gold,"Gold" %>: <br>
  <%=f.number_field :gold%><br>
  <%=f.label :tier_silver,"Silver" %>:<br>
  <%=f.number_field :silver %><br>
  <%=f.label :tier_bronze,"Bronze" %>:<br>
  <%=f.number_field :bronze %> <br><br>
  <%= f.submit "Get Tickets" %>
<% end %>

并在票证模型中添加以下代码

attr_accessor :gold,:silver,:bronze
,

编辑

我看了这里:https://guides.rubyonrails.org/form_helpers.html#understanding-parameter-naming-conventions 如果您阅读了整个部分,则可以在下面看到我在做什么。这是一个应该起作用的纯Rails解决方案。我将留给我的HTML示例作为参考...

<%= form_for(@ticket) do |f|%>

  <%= fields_for(:tier)  do |fl|%>

    <%=fl.label :gold,"Gold" %>: 
    <br>
    <%=fl.number_field :gold %>
    <br>
     
    <%=fl.label :silver,"Silver" %>:
    <br>
    <%=fl.number_field :silver %>
    <br>
    
    <%=fl.label :bronze,"Bronze" %>:
    <br>
    <%=fl.number_field :bronze %>
    <br>

  <%end%>
<%end%>

由于您没有发布模型代码,所以我不是100%肯定会成功,但是请告诉我们,我们可以根据需要进行调整。这应该给您与我下面的原始答案相同的结果。

原始答案:

您需要使用HTML格式构建要返回的哈希。

<label for="tier_gold"> Gold: </label><br>
<input type="number_field" name="ticket[tier][gold]">
<br>
<label for="tier_gold"> Silver: </label><br>
<input type="number_field" name="ticket[tier][silver]">
<br>
<label for="tier_gold"> Bronze: </label><br>
<input type="number_field" name="ticket[tier][bronze]">

这将在您的参数中返回哈希值,例如:

"ticket"=>{"tier"=>{"gold" => 1,"silver" => 3,"bronze" => 5 }

您需要确保使用以下参数将哈希值列入白名单:

params.require(:ticket).permit(:tier => [:gold,:sliver,:bronze])

可能有一种使标准form_for格式吐出此HTML的方法,但是在处理类似代码时我找不到它。如果有人知道该怎么做,我会很感兴趣,但是很容易在我的ERB文件中构建HTML。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...