[英]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
是不是
但是關注點通常用於從控制器中移出一些私有幫助器方法,而不是像本代碼段中那樣執行操作
假設我們有一個具有典型create
和new
動作的CarsController
和AirplanesController
。
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.