在Rails 4中,为什么不将genre_id
数组保存到数据库中?我认为这是因为当需要将ID保存为整数时,ID会被读取为字符串,但过去我没有遇到此问题。
尝试POST以下内容时出现no implicit conversion of String into Integer
错误:
<%= form_for @project do |f| %>
<%= select_tag 'project[genres_projects_attributes][genre_id][]',
options_for_select(Genre.order(:id).collect{|g| [g.name, g.id]}),
{ include_hidden: true, multiple: true, class: 'form-control'} %>
<% end %>
在我的应用中,
Project has_many :genres, through: :genres_projects
我的参数如下所示:
{"utf8"=>"✓","authenticity_token"=>"[xxx]",
"project"=>{"name"=>"sdfds",
"genres_projects_attributes"=>{"genre_id"=>["2",
"3",
"4"]},
"commit"=>"Go!"}
我的project_params:
def project_params
params.require(:project).permit(:id, genres_projects_attributes:
[:id, {genre_id: []}, :project_id])
end
这是我的控制器中抛出错误的行:
def create
@project = Project.create(project_params)
end
答案 0 :(得分:0)
遗憾的是没有找到答案,所以做了以下解决方法:
@genre_ids = project_params[:genres_projects_attributes][:genre_id]
@genre_ids.each do |g|
GenresProject.create!(project_id: @project.id, genre_id: g)
end
更新:
我发现这是导致问题的第一个空白值。从Rails 4.x开始,您还可以在表单中添加include_hidden: false
。
再次更新:
if project_params[:genres_projects_attributes]
@project.genres.delete_all
project_params[:genres_projects_attributes][:genre_id].each do |g|
@project.genres << Genre.find(g)
end
@project.update!(project_params.except :genres_projects_attributes)
else
@project.update!(project_params)