2

私は短い形式の浅いルーティングを使用しています:

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/newURL 呼び出しでは機能しましたが、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 を設定するのが標準的な方法ですか?

4

1 に答える 1