W route.rb:

resources :cars do
  resources :reviews
end

resources :motorcycles do
  resources :reviews
end

W kontrolerze recenzji:

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

Generowanie linku „pokaż” dla recenzji jest proste (to działa):

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

Podobnie chciałbym odwołać się do ogólnej ścieżki edycji dla recenzji, coś takiego (to nie działa):

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

Czy ktoś wie, czy jest to możliwe, a jeśli nie, jak można to osiągnąć?

10
the_real_one 31 maj 2011, 03:45
Okazuje się, że odpowiedź, której szukam, można znaleźć za pomocą pomocnika URL "edit_polymorphic_path" (patrz: rubydoc.info/docs/rails/3.0.0/ActionDispatch/Routing/…). Aby uzyskać link, którego próbuję powyżej, udało mi się to osiągnąć za pomocą: edit_polymorphic_path([@parent, @review])
 – 
the_real_one
31 maj 2011, 04:56

3 odpowiedzi

Najlepsza odpowiedź

Okazuje się, że odpowiedź, której szukam, można znaleźć za pomocą pomocnika URL „edit_polymorphic_path” (patrz: http://rubydoc.info/github/rails/rails/master/ActionDispatch/Routing/PolymorphicRoutes). Aby uzyskać link, którego próbuję powyżej, udało mi się to osiągnąć za pomocą:

edit_polymorphic_path([@parent, @review]) 
16
Billy Chan 5 maj 2013, 12:47
1
Zmieniło się to na edit_polymorphic_path(@parent, @review) w Rails 4
 – 
Bibek Shrestha
26 wrzesień 2014, 01:53
1
Nie wiem o Rails 4, ale w Rails 5 potrzebujesz nawiasów kwadratowych: edit_polymorphic_path([@parent, @review])
 – 
Steve Carey
4 maj 2017, 05:19
link_to 'Edit Review', [:edit, @parent, @review]
17
animuson 26 styczeń 2012, 05:19
To jest super, dzięki!! Czy wiesz, jak uzyskać coś takiego bez korzystania z pomocnika „link_to”?
 – 
Abramodj
29 sierpień 2013, 00:45

Myślę, że potrzebujesz tutaj asocjacji polimorficznej. Ryan Bates z Railscasts.com doskonale to wyjaśnia.

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

Ułatwi Ci to posiadanie rzeczy takich jak:

Użytkownik, menedżer, uwaga

Użytkownik może mieć wiele notatek Menedżer może mieć wiele notatek Notatka może należeć do użytkownika LUB menedżera

Użytkownicy/1/notatki/edytuj menedżerowie/1/notatki/edytuj

Railscast wyjaśni, jak to zrobić :)

EDYTOWAĆ:

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

Wtedy w twoim linku do, byłoby to coś takiego:

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

^^ Nie testowano.

1
ardavis 31 maj 2011, 06:08
W rzeczywistości mam polimorficzne skojarzenie z modelem Review: class Review, submit_to :reviewables, :polymorphic => true class Car, has_many :reviews, :as => :reviewable class Motorcycle, has_many :reviews, :as => : do przeglądu Więc nie ma nic innego od tego, co robię, niż to, co jest niestety wspomniane w Railscast i nie odnosi się do pytania, jak uzyskać trasę „edycji” dla takiego skojarzenia.
 – 
the_real_one
31 maj 2011, 04:36
Oglądałeś cały Railscast? Używa: @commentable = find_commentable I ma metodę find_commentable, aby określić, którą klasę edytuje...
 – 
ardavis
31 maj 2011, 06:05