簡體   English   中英

如何通過控制器路由

[英]How to routing to concern throug controller

為了獲得更簡潔的代碼,我想在某些方面分散我的控制器。

在我的routes.rb中如何重定向到關注點而不重新定義關注點index show destroy create ...的方法index show destroy create ...

class SomeController
  include SomeConcern

  def index
  end
end

module SomeConcern
  def index
  end
end

對不起,我的英語不好。

您必須始終映射到控制器。 問題是可以在其中放置共享邏輯的模塊(僅當在2個不同的控制器中需要2個絕對相似的方法時才有意義)。

我認為,這樣的代碼應該工作:

class SomeController
  include SomeConcern
end

module SomeConcern
  def index
  end
end

是不是

但是關注點通常用於從控制器中移出一些私有幫助器方法,而不是像本代碼段中那樣執行操作

假設我們有一個具有典型createnew動作的CarsControllerAirplanesController

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

但是,這里非常重要的一點是您沒有路由到該模塊。 該模塊正在為控制器類提供方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM