如何路由到关注throug控制器

时间:2017-11-07 16:17:59

标签: ruby-on-rails

要想拥有更清晰的代码,我想在某些问题上拆分控制器。

在我的routes.rb中如何在不重新定义关注方法的情况下重定向到关注index show destroy create ...

class SomeController
  include SomeConcern

  def index
  end
end

module SomeConcern
  def index
  end
end

抱歉我的英语不好。

2 个答案:

答案 0 :(得分:1)

您必须始终映射到您的控制器。关注的是可以放置共享逻辑的模块(只有在2个不同的控制器中需要2个绝对相似的方法时才有意义。)

我认为,这样的代码应该有效:

class SomeController
  include SomeConcern
end

module SomeConcern
  def index
  end
end

不是吗?

但是担心主要是用于从控制器中移出一些私有帮助器方法,而不是像我们在这段代码中那样执行操作

答案 1 :(得分:1)

假设我们有CarsControllerAirplanesController具有典型的createnew操作。

class AirplanesController < ApplicationController

  def new
    @airplane = Airplane.new
  end

  def create
    @airplane = Airplane.new(create_params)
    if @airplane.save 
      redirect_to @airplane
    else
      render :new
    end
  end
  # ...
end

class CarsController < ApplicationController

  def new
    @car = Car.new
  end

  def create
    @car = Car.new(create_params)
    if @car.save 
      redirect_to @car
    else
      render :new
    end
  end
  # ...
end

为了解决这个问题,我们可以将共享代码提取到模块中:

module Createable
  extend ActiveSupport::Concern

  included do
    attr_accessor :resource
    alias_attribute :self.controller_name.to_sym, :resource
  end

  def new
    @resource = resource_class.new
    yield @resource if block_given?
  end

  def create
    @resource = resource_class.new(create_params)

    if @resource.save 
      yield @resource if block_given?
      redirect_to @resource
    else
      render :new
    end
  end

  private

  def create_params
    raise "not implemented controller!"
  end

  def resource_class
    @resource_class ||= self.controller_name.classify.constantize
  end
end

然后我们可以通过以下方式将它应用于控制器类:

class CarsController < ApplicationController
  include Createable

  def create_params
    params.require(:car)
          .permit(:model) # ...
  end
end

class AirplanesController < ApplicationController
  include Createable

  def create_params
    params.require(:airplane)
          .permit(:model) # ...
  end
end

但这里非常重要的一点是你没有路由到模块。该模块为控制器类提供方法。

相关问题