尝试使用范围编写一个简单的搜索但是我收到一个奇怪的回答,我想知道是否有人可以解释我的错误。
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传递给模型而不使用从表格中传递的参数?
答案 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}%") }
在上述范围内,该项目将是您将从控制器传递的参数。