我正在构建一个 Rails 应用程序,用户可以在其中搜索“播放列表”,这是一个包含标题、图像和曲目的对象。
我在播放列表模型中定义了一种搜索方法,该方法采用一个参数:“query”。它似乎无法识别何时给出参数,返回“预期 1 个参数,给出 0 个”错误。
播放列表模型(playlist.rb)
class Playlist < ApplicationRecord
...
def self.search_all(query)
if query
self.where("title LIKE ?", "%#{search_all}%")
else
Playlist.all
end
end
end
播放列表控制器(playlists_controller.rb)
class PlaylistsController < ApplicationController
# GET /playlists or /playlists.json
def index
search = params[:search]
if search_all
@playlists = Playlist.search_all(search)
else
@playlists = Playlist.all
end
end
...
private
# Only allow a list of trusted parameters through.
def playlist_params
params.require(:playlist).permit(:title, :image, :search_all)
end
end
如何让我的控制器“看到”我添加的参数?
您的代码中有一个拼写错误:
self.where("title LIKE ?", "%#{search_all}%")
应该是
self.where("title LIKE ?", "%#{query}%")
因为这是传递给
def self.search_all(query)
的参数名称。
ActiveRecord
范围。您可以使用它来简化您的模型和控制器。
# in the model
scope :search, ->(query) { where('title LIKE ?', '%#{query}%') if query.present? }
# in the controller
def index
@playlists = Playlist.search(params[:search])
end
这在控制器中无需条件即可工作,因为即使在作用域中未调用
ActiveReord::Relation
,作用域也会返回 where
对象(与 finder 类方法相反。