Параметры области Rails - PullRequest
0 голосов
/ 03 июня 2018

Пытаясь написать простой поиск, используя область действия, однако я получаю странный ответ, и мне было интересно, может ли кто-нибудь объяснить мою ошибку.

  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>):

Есть ли способпередать параметры в модель без использования параметров, переданных из формы?

Ответы [ 3 ]

0 голосов
/ 03 июня 2018

Согласно приведенному описанию следующий код не будет работать:

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

, поскольку параметры не доступны в модели.

Измените вышеописанную область видимости на что-то, упомянутое ниже:

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

В вышеупомянутой области видимости предмет будет аргументом, который вы будете передавать от контроллера.

0 голосов
/ 03 июня 2018

В моделях Rails не осведомлены о запросе - у них нет доступа к параметрам, объекту запроса или сеансу.

Для передачи параметров из контроллера в модель, которую выпередайте их как аргументы метода:

class Thing < ApplicationRecord

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

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

scope - это всего лишь синтаксический сахар , который позволяет вам писать методы класса кратко.Таким образом, вышеприведенное было бы записано как:

class Thing < ApplicationRecord
  scope :sounds_like, ->(value){ where('title ILIKE ?', "#{ value }%")}
end

Второй аргумент scope - это 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

Паренс обозначает аргументы лямбды, как при определении методов:

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"
0 голосов
/ 03 июня 2018

Следуйте этому на вашей области видимости

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

Это должно работать.

Дополнительную информацию о области применения рельсов вы можете увидеть в этой статье

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...