11

को देखते हुए मार्गों:मार्ग चिंता और बहुलक मॉडल: नियंत्रक और विचारों को कैसे साझा करें?

Example::Application.routes.draw do 
    concern :commentable do 
    resources :comments 
    end 

    resources :articles, concerns: :commentable 

    resources :forums do 
    resources :forum_topics, concerns: :commentable 
    end 
end 

और मॉडल:

class Comment < ActiveRecord::Base 
    belongs_to :commentable, polymorphic: true 
end 

जब मैं संपादित करने या एक टिप्पणी जोड़ें, मैं वापस आ गया "commentable" वस्तु पर जाने के लिए की जरूरत है। मैं निम्न समस्याओं, हालांकि है:

1) redirect_tocomments_controller.rb में पैरेंट ऑब्जेक्ट

2) विचारों पर संदर्भ अलग हैं और साथ ही

= simple_form_for comment do |form| 

है के आधार पर अलग होगा इस comment संसाधन के लिए विचारों और नियंत्रकों को साझा करने का एक व्यावहारिक तरीका है?

उत्तर

10

आप इस तरह फिल्टर से पहले एक में माता-पिता पा सकते हैं:

comments_controller.rb

before_filter: find_parent 

def find_parent 
    params.each do |name, value| 
    if name =~ /(.+)_id$/ 
     @parent = $1.classify.constantize.find(value) 
    end 
    end 
end 

अब आप रीडायरेक्ट या कर सकते हैं जो कुछ भी आप माता-पिता प्रकार के आधार पर करें।

एक दृश्य में उदाहरण के लिए:

= simple_form_for [@parent, comment] do |form| 

या एक नियंत्रक

comments_controller.rb

redirect_to @parent # redirect to the show page of the commentable. 
+0

विचार के लिए धन्यवाद; मैं इसे जाने दूंगा हालांकि मेरे पास एक से अधिक माता-पिता हो सकते हैं। उदाहरण के लिए मुझे 'simple_form_for [फोरम, फोरम_टॉपिक, टिप्पणी]' की आवश्यकता होगी; या 'redirect_to [मंच, forum_topic]'। मैं splats के साथ खेलेंगे और देखेंगे कि यह मुझे कहाँ मिलता है। – amencarini

+0

@amencarini आप अभी भी अर्जुन को एक पक्ष कर सकते हैं और उसका जवाब स्वीकार कर सकते हैं! – Wukerplank

16

रेल में में 4 आप चिंताओं के विकल्प पारित कर सकते हैं। तो अगर आप ऐसा करते हैं:

# routes.rb 
concern :commentable do |options| 
    resources :comments, options 
end 


resources :articles do 
    concerns :commentable, commentable_type: 'Article' 
end 

फिर जब आप rake routes, आप आप की तरह

POST /articles/:id/comments, {commentable_type: 'Article'}

कि कुछ भी अनुरोध यह सुरक्षित रखने के लिए सेट करने का प्रयास को पार कर जाएगी एक मार्ग मिल देखेंगे। फिर अपने CommentsController में:

# comments_controller.rb 
class CommentsController < ApplicationController 

    before_filter :set_commentable, only: [:index, :create] 

    def create 
    @comment = Comment.create!(commentable: @commentable) 
    respond_with @comment 
    end 

    private 
    def set_commentable 
    commentable_id = params["#{params[:commentable_type].underscore}_id"] 
    @commentable = params[:commentable_type].constantize.find(commentable_id) 
    end 

end 

एक तरह से इस तरह के एक नियंत्रक का परीक्षण करने के rspec साथ है:

require 'rails_helper' 

describe CommentsController do 

    let(:article) { create(:article) } 

    [:article].each do |commentable| 

    it "creates comments for #{commentable.to_s.pluralize} " do 
     obj = send(commentable) 
     options = {} 
     options["#{commentable.to_s}_id"] = obj.id 
     options["commentable_type".to_sym] = commentable.to_s.camelize 
     options[:comment] = attributes_for(:comment) 
     post :create, options 
     expect(obj.comments).to eq [Comment.all.last] 
    end 

    end 

end 
+0

आपके उत्तर के लिए धन्यवाद, यह बहुत उपयोगी था! दुर्भाग्यवश मुझे गलती मिली है - मार्गों में। आरबी आपको 'चिंताओं' विधि का उपयोग करके चिंता का उपयोग करना होगा: "चिंताओं: टिप्पणी करने योग्य, टिप्पणी करने योग्य_ प्रकार: 'आलेख'"। –

+0

आप सही हैं, संपादन कर रहे हैं। – chris

संबंधित मुद्दे