使用Rails 5,如何考虑命名一个表单字段以便以后使用Rails Controller #create方法

时间:2017-06-11 20:14:07

标签: ruby-on-rails forms ruby-on-rails-5

在Rails 5中,我有以下模型:

Talents.rb

id | Title
1 | Jumping
2 | Skipping
3 | Running

我的API,返回Talents#Index就像这样:

[
 {"id":1,"title":"Jumping"},
 {"id":2,"title":"Skipping Rope"},
 {"id":3,"title":"Running"},
 {"id":4,"title":"Something Else"}
]

然后我想使用响应来构建表单:

<div>
   <label>Jumping</label>
   <select name="Jumping">
      <option></option>
      <option value="1">XXX</option>
      <option value="2">YYY</option>
   </select>
</div>
....

我的问题是我应该如何考虑在表单中命名才能,以便我可以将表单正确发布到Rails,然后记录用户的响应?

我是否需要使用某种类型的Key的API中的其他字段?或者对于选择名称,我应该使用ID吗?

1 个答案:

答案 0 :(得分:2)

我会做这样的事情:

<form name="my-form" method="post" action="/create">
  <div>
    <label>Jumping</label>
    <input type="hidden" name="ratings[]talent_id" value="1"></input>
    <select name="ratings[]rating">
      <option></option>
      <option value="1">Rating 1</option>
      <option value="2">Rating 2</option>
    </select>
  </div>
  <div>
    <label>Skipping</label>
    <input type="hidden" name="ratings[]talent_id" value="2"></input>
    <select name="ratings[]rating">
      <option></option>
      <option value="1">Rating 1</option>
      <option value="2">Rating 2</option>
    </select>
  </div>
  <div>
    <label>Running</label>
    <input type="hidden" name="ratings[]talent_id" value="3"></input>
    <select name="ratings[]rating">
      <option></option>
      <option value="1">Rating 1</option>
      <option value="2">Rating 2</option>
    </select>
  </div>
  <input type="submit" name="submit" value="Send">
</form>
  • 使用ratings[]会创建一个数组,这样您就可以为每个select使用相同的名称
  • 添加input类型hidden,可以指定评分的人才(每个input的值是talent_id的评分{ {1}})。

例如,如果用户选择以下内容:

    {li> select Rating 2 {li> Jumper Rating 1 {li> Jumping Rating 1

然后将以下参数发送给您的控制器:

Skipping

现在,在您的控制器中,您可以迭代Parameters: { "ratings"=>[ {"talent_id"=>"1", "rating"=>"2"}, {"talent_id"=>"2", "rating"=>"1"}, {"talent_id"=>"3", "rating"=>"1"} ] } 来创建每个对象,可能是这样的:

params[:ratings]

当然,您应该优化此方法,例如,处理错误而不是引发异常(如params[:ratings].each do |rating| rating_attributes = { user_id: user, # use the appropriate `user_id` rated_by: rater, # use the appropriate `rated_by` talent_id: rating[:talent_id], rating: rating[:rating] } Rating.create!(rating_attributes) end 所做的那样);但这会让你前进。