Rails - 在collection_select中返回一个字符串值

时间:2016-09-02 09:26:00

标签: ruby-on-rails ruby-on-rails-4

Hello StackOverflow :), 我对表单中的Collection_Select有疑问。

首先,集合选择是Searchform中的过滤器,并且select的显示正常,问题是传递给请求的值。

在我有一个正常工作的text_field_tag之前:

  <% text_field_tag :book_name, params[:book_name], placeholder: 'Book' %> #Text field Works
  

在控制台"Book_name"=>"Harry Potter"

中返回参数

集合的第二选择选择:

 <%game = Book.find_by name: params[:book_name] %>
 <% collection_select(:book, :book_name, Book.all, :id, :name, {selected: book.try(:id)}, prompt: true) %>
  

在控制台中返回:"book"=>{"book_name"=>"2"},我愿意   喜欢和上面一样返回

"book_name" => "Name"

这是搜索控制器,也许我应该改变这个?

def search
    if params[:book_name].present?
      @searchs = User.joins(:books).where(books: {name: params[:books_name]}).near(params[:city], params[:distance] || 10)

     elsif params[:city].present?
        @searchs = User.near(params[:city], params[:distance] || 10).where("id != ?", current_user.id)

    else
      @searchs = User.none

我希望有人可以帮助我。我尝试了很多不同的方法但没有任何效果非常感谢提前!

2 个答案:

答案 0 :(得分:1)

您正在返回:id

<% collection_select(:book, :book_name, Book.all, :id, :name, {selected: book.try(:id)}, prompt: true) %>

这样您就可以返回&#39;:姓名&#39;

<% collection_select(:book, :book_name, Book.all, :name, :name, {selected: Book.find_by_name(:name)}, prompt: true) %>

答案 1 :(得分:1)

你可以做两件事。 如果您希望传递书名,则应使用

<% f.collection_select(:book, :book_name, Book.all, :name, :name, your_options = {}, your_html_options = {} %>

(注意双:name,第一个用于选项,第二个用于选项文本

但是,让我说,按名称进行搜索并不是最佳做法。通过字符串查询比使用id慢得多。所以,如果我是你,我会按原样保留collection_select,我将使用这样的ID更改搜索:

      @searchs = User.joins(:books).where(books: {id: params[:books_id]}).near(params[:city], params[:distance] || 10)

甚至

@searchs = User.joins(:books).where('book_id = ?', params[:book_id]).near(params[:city], params[:distance] || 10)

如果您有更多疑问,请查看collection_select documentation