2017-04-18 45 views
1

私は問題を説明する簡単な例を足場にしました。 この例では、私はStarshipとパイロットを持っています。私は創造時に宇宙船に既存のパイロットを割り当てることができるようにしたい。選択タグを使用しているときにモデル(#...)が予想されました。ストリング(#...)エラー

starship.rb

class Starship < ApplicationRecord 
    has_one :pilot 

    validates :name, presence: true 
end 

pilot.rb

class Pilot < ApplicationRecord 
    belongs_to :starship, optional: true 

    validates :name, presence: true 
end 

宇宙船/ _form.html.erb

<div class="field"> 
    <%= f.label :pilot %> 
    <%= f.select :pilot, Pilot.all %> 
</div> 

{"name"=>"Nostromo", "pilot"=>"#<Pilot:0x007f85ff547f90>"} 

ハッシュstarships_controller.rb

def starship_params 
    params.require(:starship).permit(:name, :pilot) 
    end 

のparamsそして私は、私は私のパイロットがハッシュ内の文字列として送信されていることがわかり

Pilot(#70106745549840) expected, got String(#70106709663840) 

このエラーが出るが、私はそれがそうでなければどうやってやろうとしているのか分かりません。

+2

そのようなparamsハッシュにオブジェクトを渡すことはできません。あなたはそのオブジェクトの 'id'を送信して、後であなたの目的地にあるオブジェクトを見つけることができます。 –

答えて

4

コレクションの選択を使用し、パイロットIDだけを返します。あなたは

def starship_params 
    params.require(:starship).permit(:name, :pilot_id) 
    end 

ためattr_accessorを追加し、あなたのstarship_paramsを変更する必要があります

<%= f.collection_select(:pilot_id, Pilot.all, :id, :name) %> 

注:pilot_id

class Starship < ApplicationRecord 
    attr_accessor :pilot_id 

次のようにあなたが作成、変更...

def create 
    @starship = Starship.new(starship_params) 
    @starship.pilot = Pilot.find(@starship.pilot_id) 
    respond_to do |format| 
    ... 
+0

これを試しましたが、このエラーが発生しました。 '' Starship id:nil、name:nil、created_at:nil、updated_at:nil>の 'undefined method' pilot_id 'パイロット。私が間違いを犯した可能性のあるアイデアは? – LRP

+0

ああ、申し訳ありません、それは 'has_one'です。回答は修正されました。乾杯 – SteveTurczyn

+0

完璧に感謝します。 – LRP

0

あなたは1対1のオペレーションを持っていますということです。すべてのパイロットをリストするだけでそれらを上書きすることができます。全体のリストから1つを割り当てるよりも新しいパイロットを作成する方が良いです。

まだこのコードを試してみたい場合は、このコードを試してみてください。パイロットを転送する場合は、下記のPilot.pluck(:id)を使用することを忘れないでください。あなたのstarship_controllerで今

<div class="field"> 
    <%= f.label :pilot_id %> 
    <%= f.select :pilot_id, Pilot.where('starship_id is NULL').pluck(:id) %> 
</div> 

+0

私は 'IDなしでパイロットを見つけることができませんでした。私は 'f.select:pilot'と' params.require(:starship).permit(:name、:pilot) 'を試して、元のエラーをもう一度返しました – LRP

0

ただ、コードの下に置き換える...あなたの強いのparamsは

def starship_params 
    params.require(:starship).permit(:name, :pilot_id) 
end 

・ホープ、このことができますする必要があります

def create 
    @starship = Starship.new(starship_params) 
    pilot = @starship.build_pilot 
    pilot.id= params[:starship][:pilot_id] 
    pilot.reload 
    respond_to do |format| 
     if @starship.save 
     format.html { redirect_to root_path, notice: 'Starship successfully created.' } 
     else 
     format.html { redirect_to root_path, notice: 'Error occured.' } 
     end 
end 

を書く メソッドを作成あなたのコードであなたは行くのが良いです。

<%= f.label :pilot %> 
<%= f.select :pilot, Pilot.all.map{ |p| [p.name, p.id] } %> 

この

は選択ドロップダウンにパイロットの名前が表示されますし、節約しながら、特定のパイロットのIDを保存します。

+0

ここでも同じエラーが出ましたが、 "name" => "Nostromo"、 "pilot" => "2"} ' – LRP

関連する問題