在Rails会话中存储值

时间:2016-07-04 20:52:57

标签: ruby-on-rails ruby session

我正在学习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)

  • 我在哪里可以阅读有关如何使用会话,如何存储,如何访问和使用存储的参数...我已阅读thisthat,以及一些关于会话的博文,认证...... 但我没有理解并适用于博客中描述的其他情况。

先谢谢!

如果需要,我可以在评论中添加github中代码的链接,似乎我没有足够的声誉来发布三个链接:)

2 个答案:

答案 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文档之外还有什么建议可供初学者概述。如果您有更具体的问题,我很乐意提供帮助。