Связанные с Rails пользовательские действия не работают - PullRequest
1 голос
/ 08 марта 2012

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

В задании вас попросят сделать ссылку на название столбца "название фильма", которая сортирует фильмы по имени

Что яЯ делаю это сделать "название фильма" ссылку:

%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"}

Спасибо

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Зачем создавать для этого маршрут, если это действительно просто параметр 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.

1 голос
/ 08 марта 2012

Если это так:

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