要想拥有更清晰的代码,我想在某些问题上拆分控制器。
在我的routes.rb中如何在不重新定义关注方法的情况下重定向到关注index show destroy create ...
class SomeController
include SomeConcern
def index
end
end
module SomeConcern
def index
end
end
抱歉我的英语不好。
答案 0 :(得分:1)
您必须始终映射到您的控制器。关注的是可以放置共享逻辑的模块(只有在2个不同的控制器中需要2个绝对相似的方法时才有意义。)
我认为,这样的代码应该有效:
class SomeController
include SomeConcern
end
module SomeConcern
def index
end
end
不是吗?
但是担心主要是用于从控制器中移出一些私有帮助器方法,而不是像我们在这段代码中那样执行操作
答案 1 :(得分:1)
假设我们有CarsController
和AirplanesController
具有典型的create
和new
操作。
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
但这里非常重要的一点是你没有路由到模块。该模块为控制器类提供方法。