Rails范围参数

时间:2018-06-03 05:46:33

标签: ruby-on-rails scope

尝试使用范围编写一个简单的搜索但是我收到一个奇怪的回答,我想知道是否有人可以解释我的错误。

  scope :sounds_like, -> (item) { where('title ILIKE ?', "#{ params[:sounds_like] }%")}

我的控制器看起来像

 def index
    @items = Item.sounds_like(params[:sounds_like])
 end

尝试从API搜索时出现以下错误。

NameError (undefined local variable or method `params' for #<Class:0x00007ff553a054d8>):

有没有办法将params传递给模型而不使用从表格中传递的参数?

3 个答案:

答案 0 :(得分:3)

在Rails中,模型不是请求识别 - 他们无法访问参数,请求对象或会话。

要将参数从控制器传递到模型,请将它们作为方法参数传递:

List<? extends Cat>

scope is just a syntactic sugar,让您简明扼要地编写类方法。所以上面的内容将写成:

class Thing < ApplicationRecord

  def self.sounds_like(value)
    where('title ILIKE ?', "#{ value }%")
  end
end

# call it as:
Thing.sounds_like('foo')

class Thing < ApplicationRecord scope :sounds_like, ->(value){ where('title ILIKE ?', "#{ value }%")} end 的第二个参数是lambda - 这是一个匿名函数,其作用类似于方法:

scope

parens表示lambda的参数,就像定义方法时一样:

irb(main):001:0> l = -> (v) { puts v }
=> #<Proc:0x007f81dca27d48@(irb):1 (lambda)>
irb(main):002:0> l.call("Hello World")
Hello World
=> nil

答案 1 :(得分:1)

在您的范围内执行此操作

scope :sounds_like, -> (item) { where('title ILIKE ?', "%#{item}%") }

它应该有用。

有关导轨范围的更多信息,请参阅此article

答案 2 :(得分:0)

根据提供的说明,以下代码不起作用:

scope :sounds_like, -> (item) { where('title ILIKE ?', "#{ params[:sounds_like] }%")}

因为模型中没有params。

将上述书面范围修改为以下内容:

scope :sounds_like, -> (item) { where('title ILIKE ?', "%#{item}%") }

在上述范围内,该项目将是您将从控制器传递的参数。