0

さて、このサイトは初めてですが、これが私が持っているものです:

Report.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

検索するフィールドは、[ジョブレター]と[CD#]フィールドだけです。ドロップダウンボックスで選択したものを検索できるようにするために必要です。ところで、私はjs関数とcss関数からブートストラップを使用しています。

4

1 に答える 1

1

クエリには3つのプレースホルダー?がありますが、渡された引数は1つだけ"#{search}"です。そのように実行すると、実際に取得する必要があるのは、次のような例外です。

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

また、select_tagフォームの外にあるため、コントローラーに渡されることはありません。フォームに移動する場合、名前はすでにテキストフィールドで使用されているため、名前を変更する必要があります(たとえば、にcolumn) 。次に、とパラメータsearchの両方を検索関数に渡して、クエリを作成できます。columnsearch

ただし、これは安全ではありません。ユーザーがPOSTリクエストを操作して他の列を渡すことを妨げるものはなく、列名にプレースホルダーを使用できないため、SQLインジェクションの危険性もあります。

検索を構築するための多くの解決策があり、車輪の再発明をする必要はありません。ランサックの宝石を見てください。これがその使用方法に関する最近のRailscastです。

于 2012-08-06T15:41:03.330 に答える