Ruby on rails Rails作用域参数

Ruby on rails Rails作用域参数,ruby-on-rails,scope,Ruby On Rails,Scope,尝试使用scope编写一个简单的搜索,但我得到了一个奇怪的响应,我想知道是否有人能解释我的错误 scope :sounds_like, -> (item) { where('title ILIKE ?', "#{ params[:sounds_like] }%")} 我的控制器看起来像 def index @items = Item.sounds_like(params[:sounds_like]) end 我在尝试从API搜索时遇到以下错误 NameError (un

尝试使用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>):
namererror(未定义的局部变量或#的“params”方法):

是否有任何方法可以在不使用表单传递的参数的情况下将参数传递给模型?

在您的范围内遵循此方法

scope :sounds_like, -> (item) { where('title ILIKE ?', "%#{item}%") }
它应该会起作用


关于rails作用域的更多信息,您可以看到这一点

scope :sounds_like, -> (item) { where('title ILIKE ?', "%#{item}%") }
它应该会起作用


关于rails作用域的更多信息根据提供的描述,您可以看到以下代码不起作用:

scope :sounds_like, -> (item) { where('title ILIKE ?', "#{ params[:sounds_like] }%")}
因为参数在模型中不可用

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

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

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

根据提供的描述,以下代码将不起作用:

scope :sounds_like, -> (item) { where('title ILIKE ?', "#{ params[:sounds_like] }%")}
因为参数在模型中不可用

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

scope :sounds_like, -> (item) { where('title ILIKE ?', "%#{item}%") }
在上述范围内,该项将是您将从控制器传递的参数。

在Rails模型中,它们不支持请求-它们无权访问参数、请求对象或会话

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

class Thing < ApplicationRecord

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

# call it as:
Thing.sounds_like('foo')
scope
的第二个参数是-这是一个匿名函数,其作用类似于方法:

irb(main):001:0> l = -> (v) { puts v }
=> #<Proc:0x007f81dca27d48@(irb):1 (lambda)>
irb(main):002:0> l.call("Hello World")
Hello World
=> nil
irb(main):001:0>l=->(v){puts v}
=> #
irb(主要):002:0>l.call(“你好,世界”)
你好,世界
=>零
parens表示lambda的参数,就像定义方法时一样:

irb(main):016:0> lamb = -> (a, b) { [a,b].join(" ") }
=> #<Proc:0x007f81dc983ec8@(irb):16 (lambda)>
irb(main):017:0> lamb.call("Hello", "World")
=> "Hello World"
irb(main):016:0>lamb=->(a,b){[a,b]。加入(“”)
=> #
irb(主):017:0>羔羊。呼叫(“你好”,“世界”)
=>“你好,世界”
在Rails模型中,请求是不可感知的-它们无权访问参数、请求对象或会话

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

class Thing < ApplicationRecord

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

# call it as:
Thing.sounds_like('foo')
scope
的第二个参数是-这是一个匿名函数,其作用类似于方法:

irb(main):001:0> l = -> (v) { puts v }
=> #<Proc:0x007f81dca27d48@(irb):1 (lambda)>
irb(main):002:0> l.call("Hello World")
Hello World
=> nil
irb(main):001:0>l=->(v){puts v}
=> #
irb(主要):002:0>l.call(“你好,世界”)
你好,世界
=>零
parens表示lambda的参数,就像定义方法时一样:

irb(main):016:0> lamb = -> (a, b) { [a,b].join(" ") }
=> #<Proc:0x007f81dc983ec8@(irb):16 (lambda)>
irb(main):017:0> lamb.call("Hello", "World")
=> "Hello World"
irb(main):016:0>lamb=->(a,b){[a,b]。加入(“”)
=> #
irb(主):017:0>羔羊。呼叫(“你好”,“世界”)
=>“你好,世界”

仔细阅读您的代码。您的作用域应该引用其
参数,而不是查看
参数
(仅在控制器中可用):
where('title ILIKE?',“#{item}%”
)。您可能最初在控制器方法中编写了作用域的查询,然后将其移动到一个作用域。请仔细阅读您的代码。您的作用域应该引用其
参数,而不是查看
参数
(仅在控制器中可用):
where('title ILIKE?,“#{item}%”
)。假设您最初在控制器方法中编写了作用域的查询,然后将其移动到作用域中。