Ransack搜索错误

时间:2018-01-16 05:34:29

标签: ruby-on-rails-4 ransack

我正在使用Rails 4.2.5,Ruby 2.2,ransack。我正在尝试使用Ransack实现搜索功能。我有类似的东西:

这些代码位于abc_controller.rb:

def checked_users
  emails = ["abc@abc.com", "a@a.com", "b@b.com"]
  users_list = User.where("email in (?)", emails)
  @q = users_list.ransack params[:q]
end

这些是checked_users.html.haml中的代码:(忽略此处的网址路径。正确,现在我已经更改了它)

= search_form_for @q, url: checked_users_path(some_id: id) do |form|
  = form.text_field :user_name_or_user_email_cont, placeholder: 'Name or email', class: 'form-control'

在routes.rb中:

resources :xyz do
  resources :mno do
    get 'checked_users', controller: 'abc', action: 'checked_users'
  end
end

使用这些代码我收到错误:

ActionView::Template::Error (undefined method `user_name_or_user_email_cont' for Ransack::Search<class: User, base: Grouping <combinator: and>>:Ransack::Search):

不确定我为什么会收到此错误。

1 个答案:

答案 0 :(得分:2)

由于您正在搜索用户,我认为您可以删除文本字段中的user前缀。

例如,您有:

form.text_field :user_name_or_user_email_cont, placeholder: 'Name or email', class: 'form-control'

将其更改为此类应该有效:

form.text_field :name_or_email_cont, placeholder: 'Name or email', class: 'form-control'

另外,如果可以的话,我会考虑使用ransack的search_field代替text_field

以下是一些其他信息。我相信如果你想搜索关联,你只需要使用像user这样的前缀。例如,假设你有一个像这样的用户和玩具模型:

class User
  # attribute: first_name, String
  # attribute: last_name, String
  has_many :toys
end

class Toy
  # attribute: name, String
end

现在,您可以对用户或用户的玩具进行搜索搜索。以下是您使用search_field执行此操作的方法。在这种情况下,first_namelast_name表示用户,而toys_name表示玩具的名称。

form.search_field :first_name_or_last_name_or_toys_name_cont, placeholder: "First Name, Last Name, or Toy's Name", class: 'form-control'