9

「投稿」、「家族」、「子供」、および「写真」を使用して、簡単な家族の再会サイトを作成しようとしています。理想的には、ルート/関係を次のように構成したいと思います:

  resources :posts do
    resources :pictures
  end

  resources :fams do
     resources :pictures
     resources :kids do
       resources :pictures
     end
  end

モデルでは、必要な " belongs_to" と " has_many" の関係を と の間famsに設定してkidsいます。 Famskids、およびpostsすべては"has_many :pictures, :as => :imageable" で定義され、写真は次のように定義されます。belongs_to :imageable, :polymorphic => true

やろうとするlink_to "Edit"link_to "Destroy"picturesビューであらゆる種類の_path問題に遭遇します。 は、とpolymoric_pathの 2 つのレベルで正常に動作しますが、 の 3 レベルのケースを処理できません。オブジェクトの上にある" " オブジェクトの 2 つのレベルを処理するようには設計されていなかったと思います。もう 1 つの問題は、あるインスタンスではコントローラーが「1 レベル」のリソース ネスト状況を処理する必要があり、別のインスタンスでは「2 レベル」の状況を処理する必要があることです。これにアプローチする方法がわからない。posts-picturesfams-picturesfams-kids-picturesimageablepicturepictures

私が試したことの 1 つは、Ruby ガイドの指示に従って、リソースを複数の深さで入れ子にしないことでした。私はそれらを次のように構成しました:

  resources :posts do
    resources :pictures
  end

  resources :fams do
     resources :pictures
     resources :kids
  end

  resources :kids do
     resources :pictures
  end

これにより、家族と子供の関係が維持されなくなったため、パスに別の問題が発生しました。pictureまた、すべての異なるビュー で polymorphic_path を正しく機能させることもできませんでした。

そこで、私の主な質問は次のとおりです。Rails 3 の例/チュートリアルを知っている人はいますか?ネストされたリソース、begs-to/has_many、およびポリモーフィックな関係がすべてまとめられています。例を示しますか?(私は Rails にかなり慣れていないので、Rails の歴史的経験が不足しているため、これらの領域で見つけた Rails 2 の例は混乱を招きます。)

または、ビューのlink_to EDITandlink_to DELETEステートメントと、コントローラー の、、およびメソッドのステートメントを構造化する方法を誰かに教えてもらえますか?pictureredirect-tocreateupdatedestroypictures

ありがとう!

4

3 に答える 3

7

ネストを2レベルに制限したコード例は、答えにかなり近いです。fams->kids と kids の重複ルートを回避するには、次のように、空の配列で :only オプションを使用して、第 1 レベルの子供が kids->pictures のコンテキスト以外でルートを生成しないようにします。

resources :posts do
  resources :pictures
end

resources :fams do
  resources :pictures
  resources :kids
end

resources :kids, only: [] do # this will not generate kids routes
   resources :pictures
end

上記のコードでは、以下を使用してポリモーフィック編集 URL を作成できます。

polymorphic_url([fam, picture], action: :edit) # using Ruby 1.9 hash syntax
polymorphic_url([kid, picture], action: :edit)
于 2011-07-21T08:00:39.150 に答える
2

しばらくの間、まったく同じ問題が発生しています。現在は動作していますが、美しくありません:S

次のようなネストされたモンスターから:

http://localhost:3000/destinations/3/accommodations/3/accommodation_facilities/52

paramsオブジェクトはのようになります。

action: show
id: "52"
destination_id: "3"
accommodation_id: "3"
controller: accommodation_facilities

ここで、「id」は現在のモデル ID (チェーンの最後) を表し、他のモデルは model_name_id を持ちます

このページにネストされた別のリンクを正しくレンダリングするには、フル パスを構成するオブジェクトの配列を渡す必要があります。たとえば、架空の FacilityType オブジェクトにリンクするには、次のようにする必要があります。

 <%= link_to "New", new_polymorphic_path([@destination, @accommodation, @accommodation_facility, :accommodation_facility_type]) %>

params オブジェクトからこの配列を生成するには、application_helper.rb でこのコードを使用します。

def find_parent_models(current_model = nil)
    parents = Array.new

    params.each do |name, value|
      if name =~ /(.+)_id$/
        parents.push $1.classify.constantize.find(value)
      end
    end

    parents.push current_model

    parents
end

次に、同じリンクを自動的に作成するには、次のようにします。

 <%= link_to "New", new_polymorphic_path(find_parent_models(@accommodation_facility).push(:accommodation_facility_type)) %>

このソリューションを大ざっぱにしないようにするための指針は大歓迎です:]

于 2011-07-20T09:46:55.223 に答える
0

ポリモーフィックな関連付けの問題について話すことはできません (おそらく実際のエラーに関する詳細情報が必要です) が、ネストされたリソースを 1 レベルだけ深く定義することで、実際に正しい方向に向かっています。これは Jamis Buck による人気のある記事で、参考になり、おそらくチェックする必要があります。

于 2011-05-07T00:43:09.983 に答える