2012-03-08 2 views
1

Я работаю над заданием 2 проблемы 3 для класса saas. Я полностью новичок на рельсах и имею проблемы с проблемой.Rails ссылка на пользовательские действия не работает

Назначение просит вас сделать имя столбца «название фильма» ссылку, которая сортировать фильмы по имени

Что я делаю, это сделать «название фильма» ссылка:

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

Я на правильном пути или совершенно не так?

рейк маршруты напечатает:

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

Каков результат «рейк-маршрутов»? –

+0

Добавлено в вопрос. – alexZ

ответ

2

Почему создать маршрут для этого, когда это действительно только параметр GET? Это тоже не новое действие, оно по-прежнему отображает все фильмы, просто по-другому.

Измените index действие, чтобы сделать что-то вроде этого:

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

, а затем обновить вашу ссылку:

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

поддавайтесь искушению сделать только Movie.order(params['sort']) if params['sort'], поскольку это открывает потенциальную инъекцию SQL и, если нет, просто позволяет злоумышленнику обнаружить все столбцы в вашей таблице. Он также имеет возможность сбой, если пользователь вводит плохое значение сортировки в URL.

+0

Спасибо за ответ! Я пробовал с @movies = Movie.find (: all,: order => "title"), если params ['sort'] == 'title', и он работает. Я видел ур комментарий к риску, но @ movies.order дает неопределенный метод 'порядок 'ошибка. Не могли бы вы указать мне направление, где я могу посмотреть в документе? – alexZ

+0

Это ошибка в ответе. Movies.all возвращает массив, а не область поиска. – vise

+0

Вы используете Rails 3? –

1

Должен ли это так:

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

Таким образом, ссылка идет на фильм с идентификатором «sort_by_title», который, я думаю, не то, что мы хотим. – alexZ

Смежные вопросы