0

好的,我是这个网站的新手,但这就是我所拥有的:

报告.rb

def self.search(search)  
    if search  
      where('JOBLETTER_CD_NUMBER LIKE ? AND DATE LIKE? AND CUST LIKE ?', "%#{search}%") 
    else  
      scoped  
    end  
  end  
end  

index.html.erb

select_tag "search", options_for_select([ "Job Letter and CD #", "Date", "Cust", "Job", "Date shipped", "Date billed", "Billed by" ], params[:search]) 

form_tag reports_path, :method => 'get' do

text_field_tag :search, params[:search], :class=> "form-search", :align => "right"

<%= submit_tag "Search", :JOBLETTER_CD_NUMBER => nil, :class => "btn btn-success", :align => "right"

报告控制器

def index
    @report = Report.paginate(:per_page => 1, :page => params[:page])
    @report = Report.search(params[:search]).paginate(:per_page => 1, :page => params[:page])  
    respond_to do |format|
      format.html # index.html.erb
      format.json { render :json => @views }

    end
  end

它将搜索的唯一字段是 Job Letter 和 CD # 字段,我需要它来搜索下拉框中选择的任何内容。顺便说一句,我正在使用 js 和 css 函数的引导程序。

4

1 回答 1

1

您的查询有 3 个占位符?,但只传递了一个参数"#{search}"- 如果您这样运行它,您真正应该得到的是一个异常说明

ActiveRecord::PreparedStatementInvalid: wrong number of bind variables (1 for 3) ...

此外,您select_tag的表单在表单之外,因此它根本不会传递给控制器​​。如果将它移到表单中,则必须重命名(例如,改为column),因为该名称search已被文本字段使用。然后您可以将 thecolumnsearch参数传递给您的搜索函数来构造查询。

但是,这是不安全的,因为没有任何东西可以阻止用户通过操纵发布请求来传递任何其他列,并且由于您不能使用占位符作为列名,因此也存在 SQL 注入的危险。

有许多解决方案可以构建搜索,无需重新发明轮子。看看洗劫宝石。这是最近关于如何使用它的Railscast 。

于 2012-08-06T15:41:03.330 回答