Предположим, что у меня такая полиморфная структура.Rails - Кратко находить родительский ресурс полиморфно вложенного ресурса
map.resources :bar, :has_many => :foo
map.resources :baz, :has_many => :foo
map.resources :qux, :has_many => :foo
class Foo
belongs_to :parent, :polymorphic => true
end
class FooController < AC
before_filter :find_parent
...
private
def find_parent
# ugly way:
@parent = if params[:bar_id]
Bar.find(params[:bar_id])
elsif params[:baz_id]
Baz.find(params[:baz_id])
elsif params[:qux_id]
Qux.find(params[:qux_id])
end
end
end
Это довольно уродливо. Всякий раз, когда мы добавляем новую вещь, к которой она может принадлежать, нам нужно добавить ее без DRYly к этому before_filter.
Это также ухудшается. Предположим, что Foos - это действительно полиморфные вещи, которые могут появляться где угодно, как комментарии или теги. И предположим, что у вас есть следующие маршруты:
map.resources :bar, :has_many => :foo do |bar|
bar.resources :baz, :has_many => :foo
end
map.resources :qux, :has_many => :foo do |qux|
qux.resources :baz, :has_many => :foo
end
... теперь мы должны беспокоиться о том, чтобы проверить bar_id или baz_id первым.
Для более сложных ресурсов, возможно, этого будет недостаточно, чтобы убедиться, что вы получаете идентификатор родителя.
Что было бы идеальным, если мы могли бы сделать что-то вроде этого:
def get_parent
# fetch the parameter that immediately preceeded :id
@parent = if x = params.before(:id)
# polymorphic find
x.key.to_s[0..-4].classify.constantize.find x.value
end
end
В конце концов, наши маршруты уже закодировать родителю в силу порядка параметров в URL. Зачем отказываться от этой информации?
Итак: как это можно сделать?
ли вы в конечном итоге найти DRY способ сделать это? – hornairs