2014-02-07 2 views
0

У меня есть модель курса, и есть много разных отношений с категорией, я использую multi select на моей форме, чтобы получить массив объектов. Курс также может иметь партнер, и пользователь может выбрать это из одного выбора, но когда я хочу сохранить базу данных, я вызываю params, тогда я получаю строку вместо объекта. не знает, как я могу решить этуПартнер() ожидается, получил String()

<%= form_for @course do |f| %> 

<section class="new_course"> 
    <div class="row collapse"> 
    <div class="medium-5 small-centered column">  
     <%= f.label :course_title, :class=>"custom-prefix-class" %> 
     <%= f.text_field :title, :autofocus => true, :class=>"custom-input-class" %> 
    </div> 
    </div> 

    <div class="row collapse"> 
    <div class="medium-5 small-centered column">  
     <%= f.label :start_date, :class=>"custom-prefix-class" %> 
     <%= f.text_field :start_date, :class=>"custom-input-class" %> 
    </div> 
    </div> 

    <div class="row"> 
    <div class="medium-5 column with_chosen"> 
     <%= f.collection_select :categories, 
     Category.all ,:id,:name, 
     { include_blank: true}, 
     { class: 'chosen-select', :multiple=>true, :data => { :placeholder => ' ' }} 
     %> 
    </div> 
    </div> 
    <div class="row"> 
    <div class="medium-5 column"> 
     <%= f.collection_select :partner, 
     Partner.all.collect, :id,:name , 
     { include_blank: true }, 
     { class: 'chosen-select', :multiple=>false, :data => { :placeholder => ' Brand Partner' }} 
     %> 
    </div> 
    </div> 

В моем контроллере

def create 
    @course = Course.new(course_params) 

    end 
    if @course.save 
    render :action=>'new' 
    end  
end 

private 
def course_params  
    params.require(:course).permit(:title, :start_date,:duration,:partner,:categories => []) 
end 

// рельсы сервер вывод

Started POST "/courses" for 127.0.0.1 at 2014-02-07 16:45:28 +0200 
Processing by CoursesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"sKhAF2X6VOXTxZC9Pt51RFQfZSKdzXVWji6x4uwg+rI=", "course"=>{"title"=>"Marketing ", "start_date"=>"14-02-2014", "categories"=>["", "1", "2"], "partner"=>"1", "duration"=>"2-weeks"}, "commit"=>"Add new course"} 
Completed 500 Internal Server Error in 3ms 

ActiveRecord::AssociationTypeMismatch (Partner(#70274068591140) expected, got String(#70274066607160)): 
    app/controllers/courses_controller.rb:24:in `create' 
+0

является партнером модель ?, и конечно HAS_ONE партнера? –

+0

в вашем 'course_params' есть': партнер' key вместо ': partner => []'. –

ответ

0

попробовать это: -

кажется поскольку этот партнер является моделью и курсом has_one partner, так что вы присвоить класс партнера объект вместо идентификатора в качестве строки на самом деле, как вы можете видеть в вопросе выше стоимости

params[:course][:partner] 
    => "1" 

является строка теперь, если вы пытаетесь сделать что-то вроде @ course.partner = '1' он поднимет ошибку, как указано выше, так как на левой стороне у нас есть ассоциация партера, а справа и справа - строка.

просто сделать это

def course_params  
    params.require(:course).permit(:title, :start_date,:duration,:partner,:categories => []) 
    if params[:course][:partner].present? 
    params[:course][:partner] = Partner.find params[:course][:partner] 
    end 
end 
+0

вы можете объяснить последнюю строку –

+0

@Monk_Code last string? –

Смежные вопросы