2

本当に簡単なことをしようとしています-誰かが正しい呪文を提供してくれませんか?

基本的に、BiscuitオプションでネストしてUserいるため、次のようなルートが必要です。

/biscuits
/biscuits/1
/users/2/biscuits
/users/2/biscuits/3

リストをレンダリングするためにbiscuits/indexパーシャルを呼び出すようなビューがあります。biscuits/_indexユーザーのプロファイル ビューからこれと同じパーシャルを呼び出したいのusers/editですが、どの resource_url ヘルパーを使用すればよいかわかりません。

resources :users do
  resources :biscuits
end

class BiscuitsController < InheritedResources::Base
   belongs_to :user, optional: true
end

ユーザー/edit.html.haml:

= render 'biscuits/index', biscuits: @user.biscuits.all

ビスケット/_index.html.haml:

  - biscuits.each do |biscuit|
    %tr
      %td= biscuit.title
      %td= link_to image_tag(biscuit.file_url(:thumb,:large)), resource_url(biscuit)
      %td
        = link_to 'Show', resource_url(biscuit)
        &nbsp;|&nbsp;
      %td
        = link_to 'Edit', edit_resource_url(biscuit)

このパーシャルは at から呼び出された場合は正常に動作しますが、BiscuitsControlleratから呼び出された場合は/users/1/biscuits爆発します--ビスケット コレクションではなく、ここでユーザーを参照しているようです。NoMethodError in Users#edit undefined method 'user_url' for #<UsersController>UsersController/users/1/editresource_url

現在のコントローラーに関係なく、リソース/コレクションを強制的にリソースのコレクションにするにはどうすればよいですか?

これを行うためのより良い方法は何ですか?

また、ルートがvia を呼び出した場合、 andをオーバーライドするUsersController#collection#resource、これらのメソッドが呼び出されますか? それとも、Rails によってインスタンス化されるのは、リクエストごとに 1 つだけですか?UsersControllerBiscuitsController/users/1/biscuitsController

4

2 に答える 2

1

浅いルートでチャックします。つまり、次のとおりです。

resources :users, :shallow => true do
  resources :biscuits
end

次に、ルートをレーキして、それがうまくいくかどうかを確認します

于 2012-03-09T12:35:24.457 に答える
1

ルートの動作に関して- 私の知る限り、ネストされたルートとネストされていないルートの両方を使用したい場合は、実際には2回定義する必要があります。すなわち

resources :users do
  resources :biscuits
end
resources :biscuits

とはいえ、ネストせずにリソースにアクセスする意味がない場合にのみ、リソースをネストすることをお勧めします。ビスケットのネストされていないルートのみを残すと、問題が解決する場合があります。

resource_url について- resource_url およびコレクション メソッドへの参照は、プラグインまたは gem を使用していることを示しています。特に問題の原因であると思われるため、使用しているプラ​​グインを知らずに何が問題なのかを知ることは困難です。

の行に沿ってヘルパーを「resource_url」に置き換えます

def nested_resource_path(*args)
  args = args.compact
  return args[0] if args.size == 1
  return args
end

このように呼ばれます:

nested_resource_path(@user, biscuit) and
nested_resource_path(:edit, @user, biscuit)

BiscuitsController#index へのアクセスが機能する場合、@user は nil
です。

于 2011-10-25T12:37:59.100 に答える