gpt4 book ai didi

ruby-on-rails - 类变量和模块包含,特别是在 ActionController 中

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:37 25 4
gpt4 key购买 nike

我想要某种在单独模块中初始化的单一列表,然后可以包含在 Controller 中并在 Controller 类级别进行修改,并在 Controller 实例级别进行访问。我认为类变量可以在这里工作,但发生了一些奇怪的事情,它们似乎没有在我的结束类中被初始化。

更具体地说:

我在一个模块中有很多 Controller ,所有 Controller 都包含一些默认功能。

class BlahController < ApplicationController
include DefaultFunctionality
end

class FooController < ApplicationController
include DefaultFunctionality
end

module DefaultFunctionality
def show
render 'shared/show'
end
def model
controller_name
end
end

,例如。这不是实际的代码,但这是目前它拥有的最多的交互。

我想用一些其他功能(列表的可排序界面)来扩展它,就像这样[注意我希望能够逐个类地交换排序列表功能] :

module DefaultFunctionality
module Sortable
def sort_params
params.slice(:order, :sort_direction).reverse_merge(default_sort_params)
end
def default_sort_params
@@sorts.first
end
def set_sorts(sorts = []) #sorts = [{:order => "most_recent", :sort_direction => :desc},...]
@@sorts = sorts
end
end
include Sortable
set_sorts([{:order => :alphabetical, :sort_direction => :asc}] #never run?
end

我的想法是确保我能够逐个类地交换所有可能类别的集合,如下所示:

class FooController < ApplicationController
include DefaultFunctionality #calls the default set_sorts
set_sorts([{:order => :most_recent, :sort_direction => :asc}])
end

并且还可以在 View 中建立良好的链接,如下所示,除了我遇到错误。

___/blah/1 => shared/show.html.erb__
<%= link_to("upside down", polymorphic_path(model, sort_params) %><%#BOOOM uninitialized class variable @@sorts for BlahController %>

我认为 class_var 是一个糟糕的调用,但我想不出我还能使用什么。 (类实例变量?)

最佳答案

当然,类实例变量是可行的方法。您实际上很少需要使用类变量。

在针对您的问题的具体回答中,请记住您的模块中定义的任何代码仅在加载模块时执行一次,而不是在包含模块时执行。这种区别可能并不明显,尤其是当人们认为“include”等同于“require”时。

你需要的是:

module DefaultFunctionality
def sort_params
params.slice(:order, :sort_direction).reverse_merge(default_sort_params)
end

def default_sort_params
@sorts.first
end

def sorts=(sorts = nil)
@sorts = sorts || [{:order => "most_recent", :sort_direction => :desc}]
end

def self.included(base_class)
self.sorts = ([{:order => :alphabetical, :sort_direction => :asc}]
end
end

捕获包含模块的类的方法是相应地定义 Module.included。在这种情况下,每次包含此模块时都会调用 set_sorts,并且它位于调用类的上下文中。

我对此做了一些修改以包含一些特定的样式更改:

  • 在方法中而不是在声明中声明默认值。避免产生难以阅读的长行,或不得不将复杂的数据结构写成一行。
  • 在这种情况下使用类实例变量来完成工作。
  • 使用 Ruby 风格的 var= mutator 方法代替 set_var()

关于ruby-on-rails - 类变量和模块包含,特别是在 ActionController 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2374522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com