Редактирование нескольких записей в одном примере формы имеет неожиданные значения параметров - PullRequest
2 голосов
/ 17 января 2011

Я впервые использую 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 для формы для нескольких записей с флажком, а форму для отдельной записи с флажком (из генератора скаффолдов), они кажутся идентичными.)

...