Rails 3 - Nested resources and polymorphic paths: OK to two levels, but break at three

后端 未结 3 1120
鱼传尺愫
鱼传尺愫 2021-02-04 15:00

I\'m trying to do a simple family reunion site with: \"posts\", \"families\", \"kids\", and \"pictures\". Ideally I\'d like the routes/relationships to be structured this way:<

相关标签:
3条回答
  • 2021-02-04 15:37

    Your code example that limited your nesting to 2 levels is quite near the answer. To avoid duplicate routes for fams->kids and kids, you can use the :only option with a blank array so that the 1st-level kids will not generate routes except in the context of kids->pictures, like so:

    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
    

    For the above code, you can use the following to construct your polymorphic edit url:

    polymorphic_url([fam, picture], action: :edit) # using Ruby 1.9 hash syntax
    polymorphic_url([kid, picture], action: :edit)
    
    0 讨论(0)
  • 2021-02-04 15:37

    Have been having this exact same problem for a while. I have it working now, but it isn't beautiful :S

    From a nested monster like:

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

    Your params object ends up looking like this:

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

    where "id" represents the current model id (last on the chain) and the other ones have model_name_id

    To correctly render another nested link on this page, you need to pass in an array of objects that make up the full path, eg to link to a fictional FacilityType object you'd have to do:

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

    To generate this array from the params object, I use this code in 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
    

    Then to automatically make the same link, you can merrily do:

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

    Any pointers on making this solution less sketchy are very welcome :]

    0 讨论(0)
  • 2021-02-04 15:48

    I can't speak for the polymorphic association problem (probably need more info on the actual error) but you are indeed headed in the right direction by defining your nested resources only one level deep. Here's a popular article by Jamis Buck that has become a reference and that you should probably check out.

    0 讨论(0)
提交回复
热议问题