Rails: различное поведение контроллера в зависимости от маршрута - PullRequest
4 голосов
/ 10 мая 2011

Я ищу лучшую практику для решения следующей ситуации:

У меня есть «Аддитивная» модель, которая должна быть связана со многими другими моделями.

Примеры:

# Meal-Model
has_and_belongs_to_many :additives

# Offer-Model
has_and_belongs_to_many :additives

# Additive-Model
has_and_belongs_to_many :meals
has_and_belongs_to_many :meals

Маршруты вложены следующим образом:

resources :offers do
  resources :additives
end
resources :meals do
  resources :additives
end

Итак, я получаю URL-адреса вроде этого:

/offers/123/additives
/meals/567/additives

Оба маршрута приводят к тому же действию контроллера, которое additives#index. В AdditivesController я проверяю, доступны ли параметры, чтобы выбрать, какие данные нужно извлечь:

class AdditivesController < ApplicationController

before_filter :offermealswitch

# GET /restaurants/1/meals/123/additives
# GET /restaurants/1/offers/123/additives
def index   
  @additives = @additivemeal.additives    
end

def offermealswitch
  if params.has_key?(:meal_id)
    @additivemeal = Meal.find(params[:meal_id])
    @type = "Meal"
  elsif params.has_key?(:offer_id)
    @additivemeal = Offer.find(params[:offer_id])
    @type = "Offer"
  end
end

end

Это правильный способ решения этой проблемы? Это работает очень хорошо, но я не уверен, что это путь рельсов ... Спасибо за ваши ответы!

Ответы [ 2 ]

1 голос
/ 10 мая 2011

вздох переключение в область ответа, чтобы я мог как минимум добавить возврат каретки и сделать код не тупым.

Я согласен с ответом fl00r, но добавил бы, что вам нужносоздать экземпляр объекта таким образом:

@type = params[:type] 
@obj = @type.constantize.find(params["#{type}_id"])
@additives = @obj.additives 
1 голос
/ 10 мая 2011

РЕДАКТИРОВАТЬ относительно @Taryn East

resources :offers do
  resources :additives, :type => "Offer"
end
resources :meals do
  resources :additives, :type => "Meal"
end

class AdditivesController < ApplicationController
  before_filter :find_additive

  def index   
    @additives = @additive.additives    
  end

  private
  def find_additive
    @type = params[:type]
    @additive = @type.constantize.find([@type, "id"].join("_")) # or "#{@type}_id", as you wish
  end
end
...