我正在尝试显示一组电影列表。我想为用户评级(不同类型)和排序顺序(按标题和评级)维护会话和网址参数。但其中一个会议未得到维护。
控制器:
def index
@all_ratings = Movie.ratings
@sorted_by = (params[:sort_by] || session[:sorted_by] || :none).to_sym
@selected_ratings = params[:ratings] ? params[:ratings].keys : (session[:selected_ratings] || @all_ratings)
session[:sorted_by] = @sorted_by
session[:selected_ratings] = @selected_ratings
@movies = Movie.where(:rating => @selected_ratings).order @sorted_by
end
每次刷新请求时,都会维护会话[:selected_ratings],但会话[:sorted_by]不会。我以类似的方式制作了它们。但是电影列表的顺序从未得到保留。 params [:sorted_by]每次都有效。请帮忙。
观点:
%th {params[:sort_by] == "title" ? {:class => "hilite"} : {}}= link_to "Movie Title", movies_path(:sort_by => "title"), :id => "title_header"
%th Rating
%th{params[:sort_by] == "release_date" ? {:class => "hilite"} : {}}= link_to "Release Date", movies_path(:sort_by => "release_date"), :id => "release_date_header"
%th More Info
答案 0 :(得分:1)
首先,在您的视图中,您应该引用@sorted_by
实例var而不是param[:sort_by]
,因为param可能是nil。
其次,我怀疑params[:sort_by]
被设置为空字符串而不是nil
,正如您所期望的那样。这会导致or语句在遇到session变量之前发生短路,并且每次都会给你一个空的排序字符串。
要尝试的事项:设置调试器(pry和/或the debugger gem)并在某处的索引方法中添加断点。然后,您可以检查所有内容的值,看看实际发生了什么。