私は短い形式の浅いルーティングを使用しています:
resources :officers, except: :new
resources :members do
resources :officers, only: :new
end
これはmember has_many officers : officers belong_to member
協会です。has_many の理由は、メンバーが何年にもわたって多くの役職に就くことができるためです。
私は何年もこれに対処するのに問題を抱えていたので、関連付けられた has_many レコードの作成を処理する Rails の好ましい方法について質問することにしました。
メンバーショーページにリンクがあります:
= link_to 'New Officer', new_member_officer_path(@member)
アプリケーションには new_officer_path リンクはありませんが、誰かofficers/new
が URL を入力するのをトラップしたかったのです。Officers _form パーシャルで、新しいレコードの場合は非表示フィールドmember_id
を @member.id に設定しました ( id.nil?
)
私の最初の失敗した試み:
def new
set_member
@officer = Officer.new(member_id: @member.id)
end
def set_member
if params[:member_id]
@member = Active.find(params[:member_id])
else
redirect_to members_path, alert: "Officers must be created from the Members Show view"
end
end
アクションから呼び出されたメソッドからリダイレクトできないため、これは失敗したと思います。
次に試しました:
before_action :set_member, only: :new
def new
@officer = Officer.new(member_id: @member.id)
end
def set_member
if params[:member_id]
@member = Active.find(params[:member_id])
else
redirect_to members_path, alert: "Officers must be created from the Members Show view"
end
end
これは有効なmembers/xx/officers/new
URL 呼び出しでは機能しましたが、on URL では失敗officers/new
しました。新しいルートがないため、show アクションに行き、:id new の検索に失敗しました
リソースオフィサーの条件を削除するonly: :new
と、そのアプローチが機能しますが、不要なルートがあります。
私の最初の試みで物を動かします:
def new
set_member
if @member
@officer = Officer.new(member_id: @member.id)
else
redirect_to members_path, alert: "Officers must be created from the Members Show view"
end
end
def set_member
if params[:member_id]
@member = Active.find(params[:member_id])
end
end
動作しますが、何らかの理由で気分が良くありません。新しいルートと before_action アプローチを残すのが好きです。
繰り返しますが、標準的なアプローチを探しています。また、非表示フィールドに外部 ID を設定するのが標準的な方法ですか?