首页 > 解决方案 > Ruby Rails 保留在一种方法中使用的变量以供另一种方法访问

问题描述

我有一种方法可以对产品列表的索引进行排序。按字母顺序、评级等对它们进行排序。效果很好。

当我到达显示页面时,我添加了下一个和上一个按钮。但他们正在处理表中的下一个 ID,而不是我所做的排序中的下一个。我认为作为用户,我想循环浏览我当前选择的排序。

所以我更改了 next/previous 方法来获取当前节目产品的索引,next 将添加 +1,previous -1 到索引并检查长度 -1 以将其重新启动为零。

但这是问题所在。我需要保留排序的当前变量以供下一个/上一个方法访问。

我正在尝试的方法:我想我需要在控制器上使用 after_action 将变量放在一个方法中。index 方法包含使用的排序变量,例如:

after_action :set_product_sort, only: [:index]

  private
    def set_product_sort
      @current_product_sort = @products_sort
    end

从研究中,我一直看到我必须参与这些路线。像这样的东西:

  resources :products_controller do
    collection do
      get :set_product_sort
    end
  end

所以如果这是有道理的(我在这里超出了我的深度)。我不清楚一些事情。

如果我对 index 方法执行 before_action,则变量将不会设置为排序。所以我认为 after_action 是我需要的。但我错了吗?那个时候变量会被删除吗?

在那个路线块中,什么是“收集”。我从博客文章中获得了该块,并尝试查找“收藏”会产生有关收藏的一般信息。我在想也许集合应该是变量名(即@products_sort)?

最后,我将如何调用下一个/上一个下一个/上一个需要了解当前产品以及当前类别。当前产品已经在控制器显示方法中。该 routes.rb 块是否将排序变量设置为仅在方法中调用它?或者它是否需要点符号并且可能使下一个/上一个 self.next 和 self.previous?

标签: ruby-on-railsruby

解决方案


我猜这是一个纯粹的 Rails 应用程序?我建议为您的每个排序索引页面使用不同的路由,或者使用嵌套路由。这样你就可以做localhost:3000/products/alpha/:idorlocalhost:3000/products/by_rating/:id等​​。这样服务器就可以根据 URL 解析请求并发送适当的记录。

您的路线看起来像:

get '/products/alpha/:id/', to: 'products#show_alpha', as: 'product_alpha_show'
get '/products/by_rating/:id', to: 'products#show_by_rating', as: 'product_rating_show'

或类似的规定。

如果您不希望不同索引页面的 URL 路径不同,那么我认为您正在考虑将排序方法存储在 localStorage 或某种令牌中。

对自己编程相当陌生,但这就是我会做的。


推荐阅读