Rails 在控制器中扩展模块

Posted

技术标签:

【中文标题】Rails 在控制器中扩展模块【英文标题】:Rails extend Module in controller 【发布时间】:2018-12-16 06:20:23 【问题描述】:

我正在尝试编写一个模块,我想用我在控制器中的操作替换该模块。为此,我在我的控制器文件夹中创建了一个名为 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

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

【问题讨论】:

【参考方案1】:

这是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

【讨论】:

我收到此错误无法加载此类文件 -- /home/nilay/rail/rails-backend/app/controllers/my_awesome_module.rb 它对我有用,你做错了什么,仔细检查你的代码。 我将 my_awesome_module.rb 添加到我的控制器/关注文件夹中我还需要什么 可能会有很多问题,从代码中的拼写错误到文件名错误,在这种情况下我帮不了你,我使用上面的代码,它就像一个魅力。 你的答案是错误的编辑你的答案我修改了你的代码看看它是有效的。 gist.github.com/nwoow/1302dd43b5263d30dda42fc77755a5f0

以上是关于Rails 在控制器中扩展模块的主要内容,如果未能解决你的问题,请参考以下文章

ruby/rails:如何确定是不是包含模块?

Rails - 扩展 Ruby Gem

Codeigniter 模块化扩展 HMVC 不会加载视图

如何在 Rails 中正确使用控制器辅助模块,以及如何连接这些辅助模块?

使用 Laravel-Modules 扩展包通过模块化开发大型 Laravel 应用

模块构建失败:错误:spawn bin/rails ENOENT