Rails 4如何通过select_tag保存

时间:2014-03-14 08:18:49

标签: ruby-on-rails ruby-on-rails-4 html-select

我有这样的观点

<%= form_tag member_survey_path(@survey), :method => :post do %>
 <% @survey.each do |s| %>
  <td><%= s.title %></td>
  <td><%= select_tag 'survey[][status]', options_for_select([['AAA',"0"],['DDD',"1"],['BBB',"2"],['CCC',"3"]]) %> </td>
 <% end %>
<%= submit_tag 'submit', :class => "btn new_btn" %>
<% end %>

我不知道如何在控制器中做,以及如何通过survey.id

1 个答案:

答案 0 :(得分:1)

更改select标记的name属性,使其具有每个调查的ID:

<%= select_tag "survey[#{s.id}][status]" ....

这将建立一个这样的参数结构:

params = {:survey => {123 => {:status => 0}, 21 => {:status => 1}, 36 => {:status => 0}}} 

其中123,21&amp; 36是调查对象的ID。然后,在您的控制器中,您可以执行此操作:

params[:survey].each do |survey_id, attributes|
  if survey = Survey.find_by_id(survey_id)
    survey.update_attributes(attributes)
  end 
end

如果您想在该表单中的调查中进行其他任何可编辑的操作,则很容易做到:例如,如果您还要编辑名称,则可以添加

<td><%= text_field_tag "survey[#{s.id}][name]", s.name %></td>

这将构成像

这样的参数结构
    params = {:survey => {123 => {:status => 0, :name => "foo"}, 21 => {:status => 1, :name => "bar"}, 36 => {:status => 0, :name => "baz"}}} 

并且您仍然可以将调查的所有属性整齐地包含在一个哈希中。

顺便说一句,将变量称为“s”这样的事情并不好,因为它不会告诉读者(未来可能包括你)它是什么。 Rails约定是在类之后命名活动记录对象,所以你会说

@surveys.each do |survey|
   ..etc