Я впервые использую Rails 3 и создаю форму, в которой каждая строка представляет новый экземпляр записи, с одной кнопкой действия для создания нескольких записей одновременно.Я следил за Rails 3 Редактирование нескольких записей в одной форме и в целом все это, кажется, работает хорошо.Однако при ближайшем рассмотрении массива params [] я заметил, что некоторые значения являются неожиданными.Например, если флажок установлен в одной из строк формы, в массиве params [] он находится в неправильной строке формы.Кроме того, в массиве params, по-видимому, есть еще одна запись, чем предполагалось создать.Более конкретно
rails --version
Rails 3.0.0
ruby -v
ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux]
database schema:
create_table "observations", :force => true do |t|
t.string "name"
t.boolean "good"
t.datetime "created_at"
t.datetime "updated_at"
end
view: testapp / app / views / наблюдений / editlist.html.erb
<% form_tag :action => 'update_observations', :method => :put do %>
<table>
<% for observation in @observations %>
<%= fields_for 'observations[]', observation do |f| %>
<tr>
<td>
<%= f.label :name %>
<%= f.text_field :name %></td>
<td>
<%= f.label :good %>
<%= f.check_box :good %> </td>
</tr>
<% end %>
<% end %>
</table>
<p><%= submit_tag "Submit" %></p>
<% end %>
Контроллер
def editlist
@num = 2
@observations = Array(@num)
(0..@num-1).each do |index|
@observations[index] = Observation.new
end
respond_to do |format|
format.html
format.xml { head :ok }
end
end
def update_observations
@observations = params[:observations].collect { |observation| Observation.new(observation) }
@observations.each do |obs|
obs.save
end
redirect_to :action => 'index'
end
маршруты:
match 'observations/update_observations'
match 'observations/editlist'
resources :observations
Gemfile
source 'http://rubygems.org'
gem 'rails', '3.0.0'
gem 'sqlite3-ruby', :require => 'sqlite3'
Если я затем создам два новых наблюдения, которые называются первое (хорошее = истинное) и второе (хорошее = ложное), вот значение параметров из вывода сервера rails
Started POST "/observations/update_observations?method=put" for 127.0.0.1 at 2011-01-17 12:26:55 +1030
Processing by ObservationsController#update_observations as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"CnTHEE7L1tPndgmNZF2KEGddU/WlDf6jl8SAEiwCz6Q=", "observations"=>[{"name"=>"first", "good"=>"0"}, {"good"=>"1", "name"=>"second"}, {"good"=>"0"}], "commit"=>"Submit", "method"=>"put"}
SQL (0.3ms) SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
SQL (0.4ms) INSERT INTO "observations" ("created_at", "good", "name", "updated_at") VALUES ('2011-01-17 01:56:55.262688', 'f', 'first', '2011-01-17 01:56:55.262688')
SQL (0.4ms) INSERT INTO "observations" ("created_at", "good", "name", "updated_at") VALUES ('2011-01-17 01:56:55.347775', 't', 'second', '2011-01-17 01:56:55.347775')
SQL (0.4ms) INSERT INTO "observations" ("created_at", "good", "name", "updated_at") VALUES ('2011-01-17 01:56:55.458927', 'f', NULL, '2011-01-17 01:56:55.458927')
Redirected to http://localhost:3000/observations
Completed 302 Found in 264ms
Как вы можетесм. из параметров [], хотя я выбираю «хорошо», чтобы быть правдой для первой записи, а не для второй записи, она ложна для первой записи и «истина» для второй записи.И еще, есть третья запись с good => false, даже если я попросил только две записи (или я так думаю!)
Моя первоначальная проблема была со сложной формой, так что это моя попыткареконструировать его на простом примере.Большое спасибо, ва
ПРИМЕЧАНИЕ: я только что переделал пример с двумя строковыми полями: т.е. schema.rb
create_table "observations", :force => true do |t|
t.string "name"
t.string "good"
t.datetime "created_at"
t.datetime "updated_at"
end
И нет проблем с параметрами формы
Started POST "/observations/update_observations?method=put" for 127.0.0.1 at 2011-01-17 13:21:24 +1030
Processing by ObservationsController#update_observations as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"CnTHEE7L1tPndgmNZF2KEGddU/WlDf6jl8SAEiwCz6Q=", "observations"=>[{"name"=>"six", "good"=>"6"}, {"name"=>"seven", "good"=>"7"}], "commit"=>"Submit", "method"=>"put"}
SQL (0.3ms) SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
SQL (0.5ms) INSERT INTO "observations" ("created_at", "good", "name", "updated_at") VALUES ('2011-01-17 02:51:24.248045', '6', 'six', '2011-01-17 02:51:24.248045')
SQL (0.3ms) INSERT INTO "observations" ("created_at", "good", "name", "updated_at") VALUES ('2011-01-17 02:51:24.318928', '7', 'seven', '2011-01-17 02:51:24.318928')
Redirected to http://localhost:3000/observations
Так что, может быть, это как-то связано с флажками?
(Кстати, обычно нет проблем с булевым полем и использованием флажков, он отлично работает с использованием созданного скаффолда. Когда ясравните html для формы для нескольких записей с флажком, а форму для отдельной записи с флажком (из генератора скаффолдов), они кажутся идентичными.)