Rails 3 переопределяет именованные маршруты - PullRequest
3 голосов
/ 26 ноября 2010

У меня есть полиморфная ассоциация (не настоящая Rails) для реализации Commentable.Я хотел бы иметь возможность использовать одни и те же представления для всех комментариев, хотя.Для моих именованных маршрутов я просто хочу иметь возможность вызывать edit_comment_path и заставить его перейти к моему новому методу.

Мои маршруты будут выглядеть примерно так:

resources :posts do
  resources :comments
end

resources :pictures do
  resources :comments
end

resources :comments

Прямо сейчасЯ переопределил edit_comment_path во вспомогательном модуле, но вместо этого вызывается вызываемый resources :comments.Я сохраняю resources :comments, потому что я хотел бы иметь возможность получить прямой доступ к комментариям и некоторым миксинам, на которые я полагаюсь.

Вот мой метод переопределения в module CommentsHelper:

  def edit_comment_path(klass = nil)
    klass = @commentable if klass.nil?
    if klass.nil?
      super
    else
      _method = "edit_#{build_named_route_path(klass)}_comment_path".to_sym
      send _method
    end

РЕДАКТИРОВАТЬ

# take something like [:main_site, @commentable, @whatever] and convert it to "main_site_coupon_whatever"
  def build_named_route_path(args)
    args = [args] if not args.is_a?(Array)
    path = []
    args.each do |arg|
      if arg.is_a?(Symbol)
        path << arg.to_s 
      else
        path << arg.class.name.underscore
      end
    end
    path.join("_")
  end

Ответы [ 2 ]

3 голосов
/ 27 ноября 2010

На самом деле, ничего из этого не было необходимо, встроенные методы polymorphic_url работали просто отлично:

@ commentable установлен в before_filter в CommentsController

<%= link_to 'New', new_polymorphic_path([@commentable, Comment.new]) %>

<%= link_to 'Edit', edit_polymorphic_url([@commentable, @comment]) %>

<%= link_to 'Show', polymorphic_path([@commentable, @comment]) %>

<%= link_to 'Back', polymorphic_url([@commentable, 'comments']) %>

EDIT

class Comment < ActiveRecord::Base
   belongs_to :user
   belongs_to :commentable, :polymorphic => true

   validates :body, :presence => true 
end



class CommentsController < BaseController

  before_filter :find_commentable

private 

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

end
0 голосов
/ 26 ноября 2010

Возможно, у вас возникли проблемы при попытке перебрать маршруты с помощью вспомогательного модуля. Попробуйте определить его в ApplicationController и сделать его также helper_method. Вы также можете изменить имя, чтобы избежать конфликта, и сделать так, чтобы оно использовалось в качестве оболочки: что-то вроде этого:

helper_method :polymorphic_edit_comment_path
def polymorphic_edit_comment_path(object = nil)
  object ||= @commentable
  if (object)
    send(:"edit_#{object.to_param.underscore}_comment_path")
  else
    edit_comment_path
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...