2012-03-08 10 views
1

私はsaasクラスの課題2の問題3に取り組んでいます。私はまったく初心者で、問題に悩まされています。カスタムアクションへのリンクが正常に動作しない

割り当ては、列名を作るために「映画のタイトル」私がやっている何名

でソート映画は「映画のタイトル」リンクにあるリンク、お願いします:

%th#title_header= link_to 'Movie Title', :controller => 'movies', :action => 'sort_by_title' 

をmovies_controllerするカスタムアクションを追加します。

def sort_by_title 
    @movies = Movie.find(:all, :order => "title") 
    render movies_path 
end 

はその後私にエラーを与えるレール:

No route matches {:controller=>"movies", :action=>"sort_by_title"} 

それから私は大丈夫と言うと、ルートファイルに追加します。

match '/movies?sort_by_title', :to => 'movies#sort_by_title' 

今すぐインデックスページは罰金レンダリングが、MOVIE_TITLEのリンクをクリックしたときに何も起こりません。

私は正しい道にいるのか、まったく間違っていますか?

すくいルートが印刷されます。

match '/movies/sort_by_title', :to => 'movies#sort_by_title' 
+0

'rake routes'の出力は何ですか? –

+0

質問に追加されました。 – alexZ

答えて

2

それは本当にただGETパラメータだのに、なぜ、このためのルートを作成します。

movies GET /movies(.:format)    {:action=>"index", :controller=>"movies"} 
     POST /movies(.:format)    {:action=>"create", :controller=>"movies"} 
new_movie GET /movies/new(.:format)   {:action=>"new", :controller=>"movies"} 
edit_movie GET /movies/:id/edit(.:format)  {:action=>"edit", :controller=>"movies"} 
movie GET /movies/:id(.:format)   {:action=>"show", :controller=>"movies"} 
     PUT /movies/:id(.:format)   {:action=>"update", :controller=>"movies"} 
     DELETE /movies/:id(.:format)   {:action=>"destroy", :controller=>"movies"} 
       /movies?sort_by_title(.:format) {:controller=>"movies", :action=>"sort_by_title"} 

+0

答えをありがとう! params ['sort'] == 'title'とすれば@movies = Movie.find(:all、:order => "title")を試してみました。私はリスクについてurのコメントを見たが、@ movies.orderは未定義のメソッド 'order 'エラーを返す。あなたは私が指導部で見ることができる方向を指摘できますか? – alexZ

+0

答えの間違いです。 Movies.allはスコープ検索ではなく配列を返します。 – vise

+0

Rails 3を使用していますか? –

1

が、このような万一ありがとう?これは新しいアクションでもなく、まだ別の方法ですべての映画を表示しています。

このような何かを行うにあなたのindexアクションを変更します。

def index 
    @movies = Movie.scoped 
    @movies = @movies.order('title') if params['sort'] == 'title' 
end 

をして、あなたのリンクを更新します。それは潜在的なSQLインジェクションを開くよう

link_to 'Movie Title', movies_path(:sort => 'title') 

は、ちょうどMovie.order(params['sort']) if params['sort']を行うには誘惑に抵抗そうでない場合は、攻撃者がテーブル内のすべての列を検出することができます。また、ユーザーがURLに不正なソート値を入力するだけで失敗する可能性もあります。

+0

そのようにして、リンクはidが "sort_by_title"のムービーになります。これは私たちが望むものではないと思います。 – alexZ

関連する問題