2014-03-02 2 views
0

레일 4에서 genre_id의 배열이 데이터베이스에 저장되지 않는 이유는 무엇입니까? 정수로 저장해야 할 때 ID가 문자열로 읽혀지기 때문입니다.하지만 과거에는이 문제가 없었습니다. Rails 다중 선택 형식 : 문자열을 정수로 암시 적으로 변환하지 않음

Project has_many :genres, through: :genres_projects 

내 매개 변수

는 다음과 같이, 내 응용 프로그램에서

<%= 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 %> 

:

{"utf8"=>"✓","authenticity_token"=>"[xxx]", 
"project"=>{"name"=>"sdfds", 
"genres_projects_attributes"=>{"genre_id"=>["2", 
"3", 
"4"]}, 
"commit"=>"Go!"} 

내 project_params

나는 다음과 같은 POST하려고 no implicit conversion of String into Integer 오류가 발생합니다 :

여기
def project_params 
     params.require(:project).permit(:id, genres_projects_attributes: 
     [:id, {genre_id: []}, :project_id]) 
    end 

(10)는 오류를 던지고 내 컨트롤러의 라인입니다 :

def create 
    @project = Project.create(project_params) 
    end 
+0

당신이 있습니까? 당신이 할 때 당신은'project = Project.create (project_params)'(느낌표를 적어주세요)를 당신의 매개 변수를 전달하는 레일 콘솔에서 얻었습니까? – timpone

+0

아니요, 들어오는 프로젝트 ID가 없습니다. – allenwlee

답변

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 

UPDATE :

I을 이 문제를 일으키는 첫 번째 빈 값이라는 것을 알았습니다. Rails 4.x에서 양식에 include_hidden: false을 추가 할 수도 있습니다. 다시

UPDATE는 : 프로젝트에 대한 ID는 오는 PARAMS에 따라

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) 
관련 문제