我正在学习Rails课程,我需要“记住”用户在https请求中选择的值,以便过滤列表。
我应该在session
'Hash'
这是我的索引
def index
#list all different values for the key ratings
@all_ratings = Movie.uniq.pluck(:rating)
#order movie list based on interaction with link from view
@movies = Movie.order(params[:sort_param])
#filter movies by rating, based on checkbox from view
@movies = @movies.where(:rating => params[:ratings].keys) if params[:ratings].present?
# I intend to store here the ratings selected, and then save in session
@selected_ratings = params[:ratings].present? ? params[:ratings] : [])
#It gives this error: undefined local variable or method `selected_ratings'
session[:selected_ratings] = @selected_ratings
end
这是我的观点
%h1 All Movies
= form_tag movies_path, :method => :get do
Include:
- @all_ratings.each do |rating|
= rating
= check_box_tag "ratings[#{rating}]", @all_ratings, @selected_ratings.include?(rating)
= submit_tag 'Refresh'
%table#movies
%thead
%tr
%th{:class=> helper_class('title'), :id => ('title_header')}= link_to 'Movie Title', movies_path(sort_param: 'title')
%th Rating
%th{:class=> helper_class('release_date'), :id => 'release_date_header'}= link_to 'Release Date',movies_path(sort_param: 'release_date')
%th More Info
%tbody
- @movies.each do |movie|
%tr
%td= movie.title
%td= movie.rating
%td= movie.release_date
%td= link_to "More about #{movie.title}", movie_path(movie)
现在的问题是:
当我在视图中渲染调试时,我选择了一个过滤器[在本例中为PG],我得到了这个:
---!ruby / hash-with-ivars:ActionController :: Parameters 内容: PG:G R PG-13 PG 高德: :@permitted:false
我不太明白。我猜ivars是实例变量,但我不知道为什么哈希没有显示在正确的{hash}中,只有选中了值。
session[:selected_ratings]
来记住电影的过滤器?我的意思是,我如何使用session作为参数
也许:@movies =@movies.where(:rating => session [selected_ratings] .keys)
先谢谢!
如果需要,我可以在评论中添加github中代码的链接,似乎我没有足够的声誉来发布三个链接:)
答案 0 :(得分:0)
未定义错误是因为您引用了未定义的变量selected_ratings
(您定义@selected_ratings
,这不是同一件事。)
要回答你的第二个问题,你可以这样做:
@movies = @movies.where(:rating => session[:selected_ratings])
session
哈希很容易使用。您可以像使用常规哈希一样保存和检索值。
答案 1 :(得分:0)
如果定义了selected_ratings,为什么会得到未定义的变量错误?
@selected_ratings
已定义; selected_ratings
不是。我认为意味着做的事情是这样的:
@selected_ratings = (params[:ratings] || session[:selected_ratings] || [])
session[:selected_ratings] = @selected_ratings
请注意,这是使用符号,而不是未定义的变量。
让我们假装会话[selected_ratings]有效,如何使用它来过滤电影?也许:@movies =@movies.where(:rating => session [selected_ratings] .keys)
嗯,@selected_ratings
等于什么?我怀疑它可能是一系列评级,对吧? - 类似于:["PG", "PG-13", "R"]
。在这种情况下,ActiveRecord
足够聪明并生成SQL,您可以执行以下操作:
@movies.where(rating: @selected_ratings)
最重要的是,我在哪里可以阅读有关如何使用会话,如何存储,如何访问和使用存储的参数...我已经阅读了这个,以及一些关于会话,身份验证的博客...但我没有理解并适用于博客中描述的其他情况。
这有点模糊;我不知道除了Rails文档之外还有什么建议可供初学者概述。如果您有更具体的问题,我很乐意提供帮助。