Rails - вложенный ресурс с двумя родителями - PullRequest
3 голосов
/ 06 сентября 2010

Скажем, у меня есть дочерняя модель с двумя родительскими моделями:

Event has_many tickets

Person has_many tickets

Ticket belongs_to Event
Ticket belongs_to Person

Маршруты отображаются так, что билет всегда вкладывается в событие или человека:

resource :people do
  resources :tickets
end

resources :events do
  resources :tickets
end

Как настроить мои CRUD-действия ticket_Controller родительским ресурсом?

Сейчас я проверяю параметры и использую условные выражения:

class TicketController

  before_filter :get_person
  before_filter :get_event

  def index
    if @person do
      ...
    elsif @event do
      ...
    end
    respond_to
      ...
    end
  end

Это кажется немного утомительным для каждого действия. Есть ли более рельсовый и сухой способ сделать это?

Ответы [ 2 ]

3 голосов
/ 06 сентября 2010

Наиболее СУХОЙ было бы использовать значение атрибутаоризмы:

class TicketsController < InheritedResources::Base
  belongs_to :event, :person, :polymorphic => true
end

Бум ... готово.Однако если по какой-либо причине вы не можете использовать в значении значение атрибута значение атрибута атрибута значение sedit_resources вместо get_person или get_event, вы можете настроить фильтр на значение get_parent следующим образом:

class TicketsController < ActionController::Base
  before_filter :get_parent

  def get_parent
    if params[:person_id]
      @parent = Person.find(params[:person_id])
      @template_prefix = 'people/tickets/'
    elsif params[:event_id]
      @parent = Event.find(params[:event_id])
      @template_prefix = 'events/tickets/'
    else
      # handle this case however is appropriate to your application...
    end
  end

  # Then you can set up your index to be more generic
  def index
    @tickets = @parent.tickets
    render :template => @template_prefix + 'index'
  end
end

Редактировать: я добавилШаблон template_prefix выше для решения проблемы с шаблоном, которую вы упомянули в комментарии.

0 голосов
/ 06 сентября 2010

Вы можете сделать это:

class TicketController

  before_filter :get_object

  def index

  end

  private

  def get_object
    type = params['event_id'] ? 'event' : 'person'
    value = type.classify.constantize.find(params[:"#{type}_id"])
    name = '@' + type
    instance_variable_set(name , value)
  end

end

Есть много способов улучшить код выше.

Вы также можете написать маршруты следующим образом:

resources :people, :has_many => :tickets

resources :events, :has_many => :tickets
...