Используйте одно действие для нескольких моделей - PullRequest
6 голосов
/ 11 марта 2012

У меня около 5 моделей, которые ведут себя очень похоже.На самом деле, я бы хотел, чтобы они поделились действием для их отображения.Например, для моделей Car, Truck, Van я хочу получить определение, например:

[Car, Truck, Van].each do |Model|
  action_for Model do #I made this up to show what I mean
    def index
      @model = Model.all
      @model_names = @model.map(&:name).join(', ')
    end
  end
end

Как бы я это сделал, чтобы не определять одно и то же действие в нескольких контроллерах?(Что не очень сухо) Будет ли это в application_controller?И если спросить не так уж и много, как я могу это сделать, чтобы они также разделяли представление?

ОБНОВЛЕНИЕ

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

1 Ответ

4 голосов
/ 11 марта 2012

Хотелось бы что-нибудь подобное для вас?

module Display
  def index
    m = self.class.to_s.chomp('Controller').classify.constantize
    @model = m.all
    @model_names = @model.map(&:name).join(', ')
  end
end

В контроллерах:

class CarsController < ApplicationController
  include Display 
end

class TrucksController < ApplicationController
  include Display 
end

class VansController < ApplicationController
  include Display 
end

Редактировать: попытка сделать это без отдельных контроллеров

class DisplaysController < ApplicationController
  def index
    @model = params[:model].constantize.all
    @model_names = @model.map(&:name).join(', ')
  end
end

routes.rb

match "display" => "display#index", :as => :display

В виде

link_to "Display Cars", display_path(:model => "Car")
link_to "Display Trucks", display_path(:model => "Truck")
link_to "Display Vans", display_path(:model => "Van")

Примечание. Если вы слышали о extend для модулей и хотите знать, почему / когда использовать include против extend, см. В чем разница между включением и расширением в Ruby? (в основном include для экземпляров, расширение для методов класса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...