以所需格式为 return 参数构建 rails 表单时遇到问题

trouble building a rails form to return paramaters in desired format

我正在尝试创建一个表单,用户可以在其中向他们的帐户添加票证。门票是分层的(青铜、白银、黄金),我在弄清楚如何让表格以我想要的格式输出数据时遇到了一些麻烦。

    <%= 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"}

而我希望参数 return 类似于 {"authenticity_token"=>"xxx", "ticket"=>{"tier"=>{'gold => 1, 'silver => 3, 'bronze' => 5 }, "commit"=>"Get Tickets"}

Ticket 模型仅包含属性 user_id、raffle_id 和等级。

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

<%= 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 %>

并在您的 Ticket 模型中添加以下代码

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%>

由于您没有 post 您的模型代码,我不能 100% 确定这会起作用,但请告诉我,我们可以根据需要对其进行调整。这应该会为您提供与我在下面的原始答案相同的结果。

原回答:

您需要使用 HTML 格式构建您想要 returned 的散列。

<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]">

这将 return 您的参数中的哈希值,例如:

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

您需要确保在您的参数中将此哈希列入白名单,例如:

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

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