Ruby on rails Rails 5:模块中的控制器动作

Ruby on rails Rails 5:模块中的控制器动作,ruby-on-rails,model-view-controller,ruby-on-rails-5,Ruby On Rails,Model View Controller,Ruby On Rails 5,我意识到这是违反MVC原则的,但是如何访问类中包含的模块中的控制器名称/方法呢 模块文档HTMLbox 扩展ActiveSupport::关注点 包括做 def图标_或_文本(变量) 如果controller.action_name==“发送” “#{variable.name.capitalize}#{variable.text}\n” 其他的 变量。格式! 结束 结束 结束 结束 如何访问模块中的控制器和/或控制器.action\u name?假设您将此问题包括在控制器中,那么图标或文本方

我意识到这是违反MVC原则的,但是如何访问类中包含的模块中的控制器名称/方法呢

模块文档HTMLbox
扩展ActiveSupport::关注点
包括做
def图标_或_文本(变量)
如果controller.action_name==“发送”
“#{variable.name.capitalize}#{variable.text}\n”
其他的
变量。格式!
结束
结束
结束
结束

如何访问模块中的
控制器
和/或
控制器.action\u name

假设您将此问题包括在控制器中,那么图标或文本方法self中就是控制器。您只需调用action_name,而无需在其前面加上controller

module DocumentHTMLBoxes
  extend ActiveSupport::Concern

  included do
    def icon_or_text(variable)
      if action_name == 'send'
        "<b>#{variable.name.capitalize}</b> #{variable.text}\n"
      else
        variable.format!
      end
    end
  end
end
模块文档HTMLbox
扩展ActiveSupport::关注点
包括做
def图标_或_文本(变量)
如果操作\u name==“发送”
“#{variable.name.capitalize}#{variable.text}\n”
其他的
变量。格式!
结束
结束
结束
结束

假设您将此问题包括在控制器中,那么图标或文本方法self中就是控制器。您只需调用action_name,而无需在其前面加上controller

module DocumentHTMLBoxes
  extend ActiveSupport::Concern

  included do
    def icon_or_text(variable)
      if action_name == 'send'
        "<b>#{variable.name.capitalize}</b> #{variable.text}\n"
      else
        variable.format!
      end
    end
  end
end
模块文档HTMLbox
扩展ActiveSupport::关注点
包括做
def图标_或_文本(变量)
如果操作\u name==“发送”
“#{variable.name.capitalize}#{variable.text}\n”
其他的
变量。格式!
结束
结束
结束
结束

我建议重构代码,使其更干净:

  • 控制器级调用如下

    model_item.icon_or_text(variable, action_name)
    
  • 模块

    module DocumentHTMLBoxes
      extend ActiveSupport::Concern
    
    
    
      included do
        def icon_or_text(variable, action_name)
          if action_name == 'send'
            "<b>#{variable.name.capitalize}</b> #{variable.text}\n"
          else
            variable.format!
          end
        end
      end
    end
    
    模块文档HTMLbox
    扩展ActiveSupport::关注点
    包括做
    def图标或文本(变量、操作名称)
    如果操作\u name==“发送”
    “#{variable.name.capitalize}#{variable.text}\n”
    其他的
    变量。格式!
    结束
    结束
    结束
    结束
    

  • 我建议重构代码,使其更干净:

  • 控制器级调用如下

    model_item.icon_or_text(variable, action_name)
    
  • 模块

    module DocumentHTMLBoxes
      extend ActiveSupport::Concern
    
    
    
      included do
        def icon_or_text(variable, action_name)
          if action_name == 'send'
            "<b>#{variable.name.capitalize}</b> #{variable.text}\n"
          else
            variable.format!
          end
        end
      end
    end
    
    模块文档HTMLbox
    扩展ActiveSupport::关注点
    包括做
    def图标或文本(变量、操作名称)
    如果操作\u name==“发送”
    “#{variable.name.capitalize}#{variable.text}\n”
    其他的
    变量。格式!
    结束
    结束
    结束
    结束
    

  • 在Rails中,
    view\u context
    对象包含来自控制器的所有IVAR,并包含所有帮助程序。它还提供对会话、cookie和请求的访问。渲染模板时,它是隐式的
    self

    模型无法访问视图上下文-这是一个有意识的设计,因为它提供了一个很好的关注点分离

    如果要破坏封装,需要将上下文传递给模型

    module DocumentHTMLBoxes
      extend ActiveSupport::Concern
    
      included do
        def icon_or_text(variable, context)
          if context.action_name == 'send'
            "<b>#{variable.name.capitalize}</b> #{variable.text}\n"
          else
            variable.format!
          end
        end
      end
    end
    
    class Thing < ApplicationModel
      include DocumentHTMLBoxes
    end
    
    现在,您可以在装饰模型上调用
    图标\u或\u文本

    <% @things.each do |t| %>
      <% t.icon_or_text %>
    <% end %>
    

    在Rails中,
    视图\u上下文
    对象包含来自控制器的所有IVAR,并包括所有助手。它还提供对会话、cookie和请求的访问。渲染模板时,它是隐式的
    self

    模型无法访问视图上下文-这是一个有意识的设计,因为它提供了一个很好的关注点分离

    如果要破坏封装,需要将上下文传递给模型

    module DocumentHTMLBoxes
      extend ActiveSupport::Concern
    
      included do
        def icon_or_text(variable, context)
          if context.action_name == 'send'
            "<b>#{variable.name.capitalize}</b> #{variable.text}\n"
          else
            variable.format!
          end
        end
      end
    end
    
    class Thing < ApplicationModel
      include DocumentHTMLBoxes
    end
    
    现在,您可以在装饰模型上调用
    图标\u或\u文本

    <% @things.each do |t| %>
      <% t.icon_or_text %>
    <% end %>
    
    
    

    请检查我的答案,了解如何执行此操作:您应该更新问题,以反映您试图将其包含在模型中,如您对答案的评论所示。请检查我的答案,了解如何执行此操作:您应该更新问题,以反映您试图将其包含在模型中,如您的评论所示对答案的评论。对不起,我应该详细说明。此关注点包含在模型中。如果它包含在模型中,则必须将信息传递到方法中。如果html“#{variable.name.capitalize}{variable.text}\n”else variable.format,我可能会使用关键字参数,例如
    def icon_或_text(variable,html:)!结束
    然后像这样称呼它
    图标或文本(变量,html:action\u name=='send')
    对不起,我应该详细说明一下。此关注点包含在模型中。如果它包含在模型中,则必须将信息传递到方法中。如果html“#{variable.name.capitalize}{variable.text}\n”else variable.format,我可能会使用关键字参数,例如
    def icon_或_text(variable,html:)!结束
    然后像这样称呼它
    图标或文本(变量,html:action\u name=='send')
    在旁注上-除非你想看起来像个白痴,否则千万不要将变量命名为“变量”。每个人都知道这是一个变量!无导轨的设计是有原因的@如果鼓励在模型中生成HTML,框架将提供对视图上下文的访问@既然rials有顾虑,是不是,请说明rails作者所说的根据模型这种方式是有味道的,但您没有;Don’不要在一开始就详细阐述这个问题,只是在旁注上声明它很臭——除非你想让自己看起来像个白痴,否则千万不要把变量命名为“variable”。每个人都知道这是一个变量!无导轨的设计是有原因的@如果鼓励在模型中生成HTML,框架将提供对视图上下文的访问@既然rials有顾虑,是不是,请说明rails作者所说的根据模型这种方式是有味道的,但您没有;I don’我一开始并没有详细说明问题,只是说问题很臭。。。