1. ホーム
  2. ruby-on-rails

Rails - link_toでパラメータを渡す

2023-10-03 14:54:03

質問

私のアカウントのインデックスページにはすべてのアカウントが表示され、アカウントごとに "+ Service" へのリンクがあります。これはユーザーを /my_services/new ページに導き、アカウントのインデックスページでどのリンクをクリックしたかによって account_id フィールドに適切な ID が事前に入力されているはずです。

各ページの一番下にdebug(params)がありますが、私が試しているものでは、/my_services/newページのパラメータに表示される:controllerと:action以外のものは得られません。

私が試しているリンクはこれです。

link_to "+ Service", "my_services/new", :account_id => acct.id

次に、servicesコントローラにもロジックを用意しました。

def new
  @my_service = MyService.new
  if params[:account_id]
    @my_service.account_id = params[:account_id]
  end
end

どなたか、これを行う適切な方法を教えていただけませんか?私はまだ、私が試したいくつかの厄介な小さなハッキングでそれを動かすことができませんでした。

EDIT

もし将来この回答を見ている人がいたら、ネストしたリソース(おそらくは shallow: true オプションで)ネストされたリソースは、行くべき道であるようです。この部分の私のroutes.rbは今このようになります。

resources :accounts, shallow: true do
  resources :services
end

私のリンクは今、このようになります。

<%= link_to "+ Service", new_service_path(:service => { :account_id => @account.id } ) %>

どのように解決するのですか?

まず、link_toはhtmlタグのヘルパーで、2番目の引数はurl、その後にhtml_optionsが続きます。account_id を url のパラメータとしてパスに渡したいということですね。 routes.rbでnamed routesを正しく設定していれば、pathヘルパーを使用することができます。

link_to "+ Service", new_my_service_path(:account_id => acct.id)

モデルの値は、.NETの中にネストされたパラメータとして渡すのがベストプラクティスだと思います。

link_to "+ Service", new_my_service_path(:my_service => { :account_id => acct.id })

# my_services_controller.rb
def new
  @my_service = MyService.new(params[:my_service])
end

そして、account_idが'mass assignment'に許可されていることを制御する必要があります。rails 3では、コントローラ内で有効なパラメータをフィルタリングするために強力なコントロールを使用することができます。私は強くお勧めします。

http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods

また、account_idがユーザーによって自由に設定できない場合(例えば、ユーザーが自分の単一のaccount_idに対してしかサービスを投稿できない場合)、リクエストで送信せず、コントローラ内で以下のように追加して設定するのがベターな方法であることに注意してください。

@my_service.account_id = current_user.account_id 

attr_accessibleのroleを利用して、ユーザは自分のアカウントでしかサービスを作れないが、管理者は誰でもサービスを作れるようにすれば、この2つを組み合わせることができるのは確かです。

ご参考になれば幸いです。