Rails多选表单:没有将String隐式转换为Integer

时间:2014-03-02 18:38:36

标签: ruby-on-rails-4

在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

1 个答案:

答案 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)