Генерация пути редактирования для вложенного ресурса, на который ссылаются несколько моделей - PullRequest
10 голосов
/ 31 мая 2011

В rout.rb:

resources :cars do
  resources :reviews
end

resources :motorcycles do
  resources :reviews
end

В ReviewsController:

before_filter :find_parent

def show
  @review = Review.find(params[:id])
  respond_to do |format|
    format.html # show.html.erb
    format.xml  { render :xml => @review }
  end
end

def edit
  @review = Review.find(params[:id])
end

# ...
def find_parent
  @parent = nil
  if params[:car_id]
    @parent = Car.find(params[:car_id])
  elsif params[:motorcycle_id]
    @parent = Motorcycle.find(params[:motorcycle_id])
  end
end

Генерация ссылки "показать" для обзора просто (это работает):

= link_to "Show", [@parent, @review]

Точно так же я хотел бы сослаться на общий путь редактирования для обзора, что-то вроде (это не работает):

= link_to "Edit", [@parent, @review], :action => 'edit'

Кто-нибудь знает, возможно ли это или, если нет, как этоможет быть выполнено?

Ответы [ 3 ]

16 голосов
/ 01 июня 2011

Оказывается, ответ, который я ищу, можно найти с помощью помощника по URL "edit_polymorphic_path" (см .: http://rubydoc.info/github/rails/rails/master/ActionDispatch/Routing/PolymorphicRoutes).. Чтобы получить ссылку, которую я пытаюсь описать выше, я смог выполнить это с помощью:

edit_polymorphic_path([@parent, @review]) 
16 голосов
/ 26 января 2012
link_to 'Edit Review', [:edit, @parent, @review]
1 голос
/ 31 мая 2011

Я думаю, что вам здесь нужна полиморфная ассоциация.Райан Бейтс из Railscasts.com прекрасно это объясняет.

http://railscasts.com/episodes/154-polymorphic-association

Вам будет легко иметь такие вещи, как:

Пользователь, Менеджер, Примечание

У пользователя может быть много заметок. У менеджера может быть много заметок. Заметка может принадлежать пользователю ИЛИ менеджеру

пользователи / 1 / заметки / редактировать менеджеры / 1 / заметки / редактировать

Railscast объяснит, как это сделать:)

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

def edit
  @reviewable= find_reviewable
  @reviews= @reviewable.reviews
end

private

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

Тогда в вашей ссылке на это будет что-то вроде:

link_to 'Edit Review', edit_review_path([@reviewable, :reviews])

^^ Не проверено.

...