3

わかりました。これはSaasコース用であり、人々はそれに関連する質問も行っていますが、私は多くの時間を試して読んでいて、行き詰まっています。まず、Movieというモデルがある場合は、評価をモデルとして使用して関連付けるか、空間に浮かぶ配列に評価を保持する方がよいでしょう(!)。次に、コントローラーに現在あるものを次に示します。

def index

@movies = Movie.where(params[:ratings].present? ? {:rating => (params[:ratings].keys)} :   {}).order(params[:sort])
@sort = params[:sort]
@ratings = Ratings.all

end

今、私はそれがより良いだろうと思ったので、評価モデルを作成することにしました。これが私の見解です:

= form_tag movies_path, :method => :get do

Include:
- @ratings.each do |rating|
 = rating.rating
 = check_box_tag "ratings[#{rating.rating}]"
= submit_tag "Refresh"

「.include?(rating)?true:」で終わるチェックボックスタグ内の条件付き3項の使用に関連するすべてを試しましたが、機能するはずのすべてを試しましたが、機能しません。正確な答えは必要ありません。 、ガイダンスが必要です。よろしくお願いします。

更新(コントローラーのメソッド):

わかりやすくするために、このハッシュを読み取っているコントローラー内のインデックスメソッドを次に示します。以前、あいまいさをお詫び申し上げます。

def index    
  @all_stores = Product.all_stores
  @selected_stores = params[:stores] || session[:stores] || {}

  if @selected_stores == {}
    @selected_stores = Hash[@all_stores.map {|store| [store, store]}]
  end
  if params[:stores] != session[:stores]
    # session[:stores] = @selected_stores
    session[:stores] = params[:stores]
    redirect_to :stores => @selected_stores and return
  end
  @products = Product.order("created_at desc").limit(150).find_all_by_store(@selected_stores.keys).group_by { |product| product.created_at.to_date}
. . . etc
4

1 に答える 1

12

いくつかのこと

1).order(params[:sort])SQLインジェクション攻撃にさらされる可能性があります。これをクエリ文字列に入力すると、誰かがすべてのユーザーを削除する可能性があります。

http://localhost:3000/movies?sort=email%3B+DELETE+from+users+--

Rails 3のactiverecordの順序を参照してください-適切なSQLインジェクションの回避策は何ですか?、この問題は.whereでは存在しません。railsはwhereメソッドの入力をサニタイズします

2)マイナーなことですが、ARELは、コレクションを反復処理するまでdbへの実際の呼び出しを遅らせるので、クエリを「構築」できます。この構文は、三項演算子を使用するよりも理解しやすいかもしれません。

@movies = Movie.order(xxxxxx)
@movies = @movies.where(:rating => params[:ratings].keys) if params[:ratings].present?

3)cdesrosiersが定数は問題ないと言っているように、あなたの評価については、あなたの見解

Movie::RATINGS.each do |rating|
  check_box_tag "ratings[]", rating # <input type="checkbox" name="ratings[]" value="PG" />

編集:選択した値を維持する

# controller
@selected_ratings = (params[:ratings].present? ? params[:ratings] : [])

# view
Movie::RATINGS.each do |rating|
  check_box_tag "ratings[]", rating, @selected_ratings.include?(rating)
  # <input type="checkbox" name="ratings[]" value="PG" checked="checked" />

チェックボックスの名前の[]に注意してください。これにより、コントローラーアクションの配列としてparams [:ratings]が提供されます。

@movies = @movies.where("rating IN (?)", params[:ratings]) if params[:ratings].present? and params[:ratings].any?

いくつかのリンク

于 2012-06-10T22:05:16.607 に答える