我遇到了错误:
PrintsController#update中的TypeError
无法将String转换为整数
我使用的表单代码是:
<%= form_for @print do |f| %>
....
....
<%= f.fields_for :blackwhites_attributes do |blackwhite| %>
<%= blackwhite.select :newpages , options_for_select((1..(@print.number_of_images_entry)).to_a), {}, :multiple => true, :size => @print.number_of_images_entry %>
<% end %>
在我的development.log中,我发现“newpages”选择字段中有一个空值。
> Parameters: {"utf8"=>"✓", "authenticity_token"=>"xAs20vFEt3vEBOhFugOyR0nWIgkoMJ0d4JPbl5E5VQ4=",
> "print"=>{"quantity"=>"1", "blackwhites_attributes"=>{"newpages"=>["",
> "2", "3"]}, "comment"=>""}, "commit"=>"Update Print", "id"=>"5"}
> User Load (0.2ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1000 LIMIT 1
> Print Load (0.3ms) SELECT `prints`.* FROM `prints` WHERE `prints`.`id` = ? LIMIT 1 [["id", "5"]]
> SQL (0.1ms) BEGIN
> (0.1ms) ROLLBACK
> Completed 500 Internal Server Error in 6ms
我的blackwhite模型也有“序列化”以存储到数据库中的数字数组:
class Blackwhite < ActiveRecord::Base
attr_accessible :newpages, :print_id
serialize :newpages
belongs_to :print
end
但我发现问题是打印控制器更新没有构建表单而且我在Prints_controller中有构建
def update
@print = Print.find(params[:id])
@print.blackwhites.build
if @print.update_attributes(params[:print])
redirect_to @print, :flash => { :success => "Successfully updated your Print Order." }
else
render :action => 'edit'
end
end
打印模型:
class Print < ActiveRecord::Base
has_many :blackwhites
belongs_to :user
accepts_nested_attributes_for :blackwhites, :allow_destroy => true
attr_accessible :comment, :document, :document_file_name,
:document_file_size, :document_updated_at, :is_printing,
:is_processing_image, :user_id, :document_content_type,
:number_of_images_entry, :is_delivered, :quantity, :blackwhites_attributes
...
...
end
答案 0 :(得分:0)
空字符串可能是select的默认值。您可以通过确保:include_blank和:prompt不设置为真实的东西来配置助手不使用助手。
另一个可能的解决方案是摆脱
attr_accessible :newpages
并将其替换为
def newpages
self[:newpages].map(&:presence).compact
end
和/或
def newpages=(ary)
self[:newpages] = ary.map(&:presence).compact
end
最后,更好的整体解决方案是使用FormObject模式而不是accepts_nested_attributes。然后,您可以完全控制模型的构建和持久性。请参阅此处的第3项:http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/