控制器中的Rails运行时错误#Index - 不支持:符号

0 ruby-on-rails search-form ruby-on-rails-4

我在我的应用程序中实现了几个不同的搜索表单,试图实现一个特定的操作(输入对象ID并直接进入该实例的Show Page),并且我对此问题非常接近,直到遇到Unsupported: Symbol运行时错误for Cards#Index.

这是搜索表单(我把它放入layouts/application.html.erb:

<%= form_tag(cards_path, :method => "get") do %>
  <div class="input-append">
    <%= text_field_tag :search, params[:search], class: "span2", placeholder: "Search Cards" %>
    <button class="btn" type="submit"><i class="icon-search"></i></button>
  </div>
<% end %>
Run Code Online (Sandbox Code Playgroud)

这是我的cards_controller.rb索引动作:

  def index
    if params[:search]
      @cards = Card.search(params[:search]).order("created_at DESC")
    else
      @cards = Card.order("created_at DESC")
    end
  end

  def show
  end

  private

  def set_card
    @card = Card.find(params[:id])
  end

  def card_params
    params.require(:card).permit(:title, :description)
  end
Run Code Online (Sandbox Code Playgroud)

和模型 card.rb

class Card < ActiveRecord::Base 
  validates :title, presence: true, uniqueness: true
  validates :description, presence: true

  def self.search(query)
    where(:id, query)
  end
end
Run Code Online (Sandbox Code Playgroud)

我正在使用where("title like ?", "%#{query}%")该模型,但我读到以这种方式制作SQL查询存在安全风险,我也在寻找完全匹配.

那么是什么阻止了视图识别搜索传递的id参数?

Fre*_*ung 5

您的视图没有任何问题 - 问题在于您的搜索方法

where(:id, query)
Run Code Online (Sandbox Code Playgroud)

这不是一个有效的用途where.

它应该是

where(id: query)
Run Code Online (Sandbox Code Playgroud)

或者,稍微更老的学校:

where("id = ?", query )
Run Code Online (Sandbox Code Playgroud)