ruby-on-rails 在Rails会话中存储值

w41d8nur  于 2023-02-26  发布在  Ruby
关注(0)|答案(2)|浏览(155)

我正在学习一门关于Rails的课程,我需要"记住"用户在https请求中选择的值,以便过滤列表。
我应该在session "哈希"中执行此操作。
下面是我的索引:

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
elements:
  PG: G R PG-13 PG
ivars:
  :@permitted: false

我不太明白,我猜ivars是示例变量,但我不知道为什么哈希没有显示在正确的{hash}中,而且只显示选定的值。

  • 我如何使用session[:selected_ratings]来记住电影的过滤器?我的意思是,我如何使用session作为参数。

或许:

@movies =@movies.where(:rating => session[selected_ratings].keys)
  • 我在哪里可以读到关于如何使用会话、如何存储、如何访问和使用存储的参数...我读过这个、that,还有一些关于会话、身份验证的博客...但是除了博客中描述的情况外,我没有设法理解和应用到其他情况。
yrefmtwq

yrefmtwq1#

如果定义了selected_ratings,为什么会出现未定义变量错误?
定义了@selected_ratings;selected_ratings不是。我认为,您 * 想要 * 做的事情类似于:

@selected_ratings = (params[:ratings] || session[:selected_ratings] || []) 
session[:selected_ratings] = @selected_ratings

注意,这里使用的是 * 符号 *,而不是未定义的 * 变量 *。
假设会话[selected_ratings]有效,我如何使用它来过滤电影?@movies =@movies.其中(:评级=〉会话[选定的评级].键)
那么,@selected_ratings等于什么?我猜它可能是一个评级数组,对吧?-类似于:["PG", "PG-13", "R"]。在这种情况下,ActiveRecord非常聪明,可以生成SQL,您只需执行以下操作:

@movies.where(rating: @selected_ratings)

最重要的是,我在哪里可以读到关于如何使用会话,如何存储,如何访问和使用存储的参数...我读了这个,那个,还有一些关于会话,身份验证的博客...但是我没有设法理解和应用到博客中描述的其他情况。
这有点含糊我不知道除了Rails文档之外还有什么建议可以给初学者提供。如果你有更具体的问题,我很乐意帮助你。

rqenqsqc

rqenqsqc2#

未定义错误是因为您引用了未定义的变量selected_ratings(您定义了@selected_ratings,这不是一回事)。
要回答第二个问题,您可以这样做:

@movies = @movies.where(:rating => session[:selected_ratings])

session散列很容易使用。你可以像使用普通散列一样保存和检索值。

相关问题