Rails - link_toでパラメータを渡す
質問
私のアカウントのインデックスページにはすべてのアカウントが表示され、アカウントごとに "+ 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つを組み合わせることができるのは確かです。
ご参考になれば幸いです。
関連
-
[解決済み】修正方法:エラー:'<ファイル名>'にチェックアウトされたコミットがない fatal: コマンドプロンプトで "git add ." を入力するとファイルの追加に失敗する
-
[解決済み】コレクションをDESCで並べる方法
-
[解決済み] heroku open - no app specified
-
[解決済み] サーバーはRailsで既に稼働している
-
[解決済み] "render :nothing => true" は空のプレーンテキストファイルを返すのですか?
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み】Railsの認証トークンを理解する
-
[解決済み] Ruby On Railsで前のページにリダイレクトする方法は?
-
[解決済み] Rails、link_toヘルパーをクリックした後にjavascriptがロードされない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コレクションをDESCで並べる方法
-
[解決済み] Ruby/Rails の「フック」とは何ですか?
-
[解決済み] どのようにrailsでラジオボタンを正しく使用するには?
-
[解決済み] どなたか、collection_selectをわかりやすく説明していただけませんか?
-
[解決済み] rails erb フォームヘルパー options_for_select :selected
-
[解決済み] Ruby: public static メソッドを作るには?
-
[解決済み] バリデーションなしで属性を更新する方法
-
[解決済み] 属性を割り当てる場合、引数としてハッシュを渡す必要がある
-
[解決済み] Rails 4で、以前のバージョンのRailsでattr_accessibleを使用していた状況に遭遇した場合、Forbidden Attributes Errorが発生する。
-
[解決済み] Railsコンソール:リロード!モデルファイルの変更が反映されない?考えられる理由は何でしょうか?