我正在为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
然后rails给我错误:
No route matches {:controller=>"movies", :action=>"sort_by_title"}
然后我说好,并将其添加到路径文件中:
match '/movies?sort_by_title', :to => 'movies#sort_by_title'
现在索引页面呈现正常,但单击movie_title链接时没有任何反应。
我是走在正确的道路上还是完全错了?
rake路线打印:
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 :(得分: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中输入错误的排序值,它也有可能失败。
答案 1 :(得分:1)
它是否应该这样:
match '/movies/sort_by_title', :to => 'movies#sort_by_title'