0

Album と Song の 2 つのモデルがあるとします。Album は属性として album_title を持ち、Song は song_title と album_id を持ちます。
協会は次のとおりです。

class Album < ActiveRecord::Base
  has_many :songs, dependent: :destroy
end

class Song < ActiveRecord::Base
 belongs_to :album
end

新しい曲を作成するには、album_id を指定する必要があります。私が欲しいのは、データベースに保存されているアルバムの ID を使用して、入力フィールドに album_id の代わりに album_title を入力して新しい曲を作成する機能です。

私はこれを思いつくことができました:

<%= f.select :album_id, Album.all.collect{ |a| [a.album_title, a.id] }  %>

リストからアルバムを選択し、その ID を album_id に割り当てることができます。それは私の小さな学期のプロジェクトでは機能しますが、最初に望んでいたことを達成できるかどうか知りたい. それとも、別のアプローチを取る必要がありますか?

4

1 に答える 1

0

このアプローチに問題はありません。ただし、同じことをもう少しクリーンに実行できるヘルパー メソッドがあります。

<%= f.collection_select :album_id, Album.all, :id, :album_title %>

アップデート

理解が深まったので、text_field_tag を使用してこれを実現できます。

<%= text_field_tag :album_title %>

コントローラーでfind_or_create、アルバムを取得するために使用します。

@song = params[:song]
if params[:album_title].present?
  album = Album.find_or_create_by_album_title(params[:album_title])
  @song.album = album
else
  @song.errors.add(:album_id, "cannot be blank")
end

さらに良いことに、このロジックをソング モデルに移動して、コントローラーをクリーンアップします。

于 2013-05-22T20:41:14.797 に答える