首页 > 解决方案 > Rails 在控制器中扩展模块

问题描述

我正在尝试编写一个模块,我想用我在控制器中的操作替换该模块。为此,我在我的控制器文件夹中创建了一个名为 test 的模块。我想把我的动作我的控制器动作代码是:

 def test
  rain_fall_type = "test"
  year  = ""
  compare = params[:compare]
  respond_to do |format|
      format.html { render json: rain_fall_type }
  end
end 

我想将此代码放入我的模块代码中我已将此代码添加到我的模块中,其代码为:

 module Test 
    def test
        rain_fall_type = "params[:rain_fall_type]
        views  = params[:views]"
        year  = ""
        compare = params[:compare]
        respond_to do |format|
            format.html { render json: rain_fall_type }
        end
    end 
end

我正在尝试将其扩展到我的控制器中,因此我将扩展测试放入我的控制器中,但出现此错误:

The action 'test' could not be found for ProductionProductivity7sController

当我从模块中删除 def test 并将此代码放入控制器时,如下所示:

 def test
   extend Test
 end

我从模块中删除了 def test 并将其更改为:

   module Test 
        rain_fall_type = "params[:rain_fall_type]
        views  = params[:views]"
        year  = ""
        compare = params[:compare]
        respond_to do |format|
            format.html { render json: rain_fall_type }
        end

end

当我这样做时,我收到此错误:

undefined local variable or method `params' for Test:Module

我应该怎么做才能将我的测试操作替换到我的模块中。

标签: ruby-on-railsmodulecontroller

解决方案


这是一个很好的任务concerns,这里有一个例子:

你的控制器代码:

class ProductionProductivity7sController < ApplicationController
  include Concerns::MyAwesomeModule
end

您的模块放置在app/controllers/concerns/my_awesome_module.rb

module Concerns
  module MyAwesomeModule
    extend ActiveSupport::Concern
    included do
      # here you can use controller level methods
      # like `before_action` 
    end

    def the_action_name
      # your logic goes here
      # you can use all variables from original controller
      # for e.g. `params`, `render` and so on.
    end
  end
end

推荐阅读