Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中,在何处放置控制器和模型的有用函数_Ruby On Rails - Fatal编程技术网

Ruby on rails 在Rails中,在何处放置控制器和模型的有用函数

Ruby on rails 在Rails中,在何处放置控制器和模型的有用函数,ruby-on-rails,Ruby On Rails,假设我有一个trim_string(string)函数,我想在Rails应用程序中,在模型和控制器中使用它。如果我把它放在application helper中,它就会进入控制器。但是,模型中通常不需要应用程序助手。那么,您将要在模型和控制器中使用的通用代码放在何处?在回答特定问题“您将要在模型和控制器中使用的通用代码放在何处?”: 把它放在lib文件夹中。将加载lib文件夹中的文件,其中的模块将可用 更详细地说,使用问题中的具体示例: # lib/my_utilities.rb module

假设我有一个trim_string(string)函数,我想在Rails应用程序中,在模型和控制器中使用它。如果我把它放在application helper中,它就会进入控制器。但是,模型中通常不需要应用程序助手。那么,您将要在模型和控制器中使用的通用代码放在何处?

在回答特定问题“您将要在模型和控制器中使用的通用代码放在何处?”:

把它放在lib文件夹中。将加载lib文件夹中的文件,其中的模块将可用

更详细地说,使用问题中的具体示例:

# lib/my_utilities.rb

module MyUtilities
  def trim_string(string)
    do_something
  end    
end
然后,在您想要的控制器或模型中:

# models/foo.rb

require 'my_utilities'

class Foo < ActiveRecord::Base
  include MyUtilities

  def foo(a_string)
    trim_string(a_string)
    do_more_stuff
  end
end

# controllers/foos_controller.rb

require 'my_utilities'

class FoosController < ApplicationController

  include MyUtilities

  def show
    @foo = Foo.find(params[:id])
    @foo_name = trim_string(@foo.name)
  end
end
#models/foo.rb
需要“我的工具”
类Foo
看起来您希望字符串类上有一个方法来“修剪”自己,而不是修剪字符串函数,对吗?你不能用剥离法吗

您可以在初始值设定项上向string类添加新方法,请选中此项

这样你就可以做到:

s = '  with spaces '
another_s = s.trim #trim and save to another
s.trim! #trim itself

但是检查String类,它看起来已经有了您需要的东西

我认为monkey patching String为用户提供了一个函数来操作模型和控制器中可用的字符串,听起来有点极端。它看起来像是一些真正绑定到字符串的函数(名称是trim_String!!),为什么不在字符串类中使用它呢?我想这取决于OP needsSo,我听到你在说什么了-但它只是一个操纵字符串的方法,我们不会因为一个方法操纵这种类型的数据而倾向于去猴子修补核心类的级别。如果存在更简单的解决方案,通常认为最好避免对核心类进行修补。在这种情况下,用户只希望控制器和模型可以使用一种方法,这就是问题所在。因此,这个问题的正确答案是将这样的共享方法放在lib的模块中,而不是习惯性地对核心类进行猴子补丁。这是我的想法,但是ymmv。
s = '  with spaces '
another_s = s.trim #trim and save to another
s.trim! #trim itself