Я только что обновил старое приложение с Rails 3.2.7
до 3.2.21
и с Ruby 1.9.3
до 2.0.0
и получил следующую ошибку при проверке приложения:
Started PUT "/books/17" for 127.0.0.1 at 2015-01-20 16:15:10 -0800
Processing by BooksController#update as HTML
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"mXizjcxG5Yq0BYG9vvvuqjW6O3/KhG6fUkoEeU6ORP8=",
"book"=>{"new_book_item_attributes"=>{"1421799301.062898"=>{"content_id"=>"16"}}},
"commit"=>"Add selected content", "id"=>"17"}
ActiveRecord::UnknownAttributeError (unknown attribute: new_book_item_attributes):
app/controllers/books_controller.rb:70:in `block in update'
app/controllers/books_controller.rb:69:in `update'
Вот мой соответствующий код:
books_controller.rb:69
if @book.update_attributes(params[:book])
book.rb
class Book < ActiveRecord::Base
attr_accessible ... :new_book_item_attributes
def new_book_item_attributes=(attributes)
attributes.each do |attribute|
book_items.build(skip_over_time(attribute))
end
end
Я просмотрела каждую запись блога на http://weblog.rubyonrails.org/releases/ из Выпущена версия Rails 3.2.8.rc1! to Выпущены версии 3.2.21, 4.0.12 и 4.1.8, и я не заметил ничего радикального, что могло бы объяснить это проблема. В любом случае, это было обновление «на уровне патча», поэтому я не ожидал каких-либо радикальных изменений. Есть идеи, что может быть виновато?
Обновить
- Эта проблема не возникает с Rails
3.2.21
и Ruby1.9.3
(она возникает только с Ruby2.0.0
(независимо от Rails (3.2.21
или3.2.7
)).
Я изменил блок кода, указанный @xavier-shay, следующим образом:
puts "-1- attributes: #{attributes.inspect}"
attributes.each do |k, v|
puts "-2- testing k: #{k}, v: #{v}"
if k.include?("(")
puts "-3- true to k.include?(\"(\")"
multi_parameter_attributes << [ k, v ]
elsif respond_to?("#{k}=")
puts "-4- true to respond_to?(\"#{k}=\")"
if v.is_a?(Hash)
puts "-5- true to v.is_a?(Hash)"
nested_parameter_attributes << [ k, v ]
else
puts "-6- else"
send("#{k}=", v)
end
else
puts "-7- UnknownAttributeError"
raise(UnknownAttributeError, "unknown attribute: #{k}")
end
end
Выполнение этого на Ruby 2.0.0
и Rails 3.2.21
вызывает исключение для указанных выше параметров:
-1- attributes: {"new_book_item_attributes"=>{"1421825320.571702"=>{"content_id"=>"8"}}}
-2- testing k: new_book_item_attributes, v: {"1421825320.571702"=>{"content_id"=>"8"}}
-7- UnknownAttributeError
...впрочем, в другом контроллере (и явно с другими параметрами) проблем нет:
-1- attributes: {"title"=>"test title", "subtitle"=>"test subtitle"}
-2- testing k: title, v: test title
-4- true to respond_to?("title=")
-6- else
-2- testing k: subtitle, v: test subtitle
-4- true to respond_to?("subtitle=")
-6- else
Запустив это на Ruby 1.9.3
и Rails 3.2.21
проблем не возникнет:
-1- attributes: {"new_book_item_attributes"=>{"1421828430.9315462"=>{"content_id"=>"8"}}}
-2- testing k: new_book_item_attributes, v: {"1421828430.9315462"=>{"content_id"=>"8"}}
-4- true to respond_to?("new_book_item_attributes=")
-5- true to v.is_a?(Hash)
-1- attributes: {"content_id"=>"8"}
-2- testing k: content_id, v: 8
-4- true to respond_to?("content_id=")
-6- else
-1- attributes: {"book_id"=>17}
-2- testing k: book_id, v: 17
-4- true to respond_to?("book_id=")
-6- else
Этот вывод указывает на Ruby, а не на Rails. Любые идеи о том, как я должен отлаживать дальше?
x
? - person 7stud   schedule 21.01.2015xxx
, и проблема была идентична. Еще раз большое спасибо за вашу помощь. - person user664833   schedule 21.01.2015