Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 尝试通过嵌套路由筛选数据_Ruby On Rails - Fatal编程技术网

Ruby on rails 尝试通过嵌套路由筛选数据

Ruby on rails 尝试通过嵌套路由筛选数据,ruby-on-rails,Ruby On Rails,我有一个Rails应用程序,允许用户提问,由专业人士回答。除了问答模式外,该应用程序还通过以下方式跟踪类别 Question.rb has_many :categorizations has_many :categories, through: :categorizations Category.rb has_many :categorizations has_many :questions, through: :categorizations 分类.rb belongs_t

我有一个Rails应用程序,允许用户提问,由专业人士回答。除了问答模式外,该应用程序还通过以下方式跟踪类别

Question.rb

 has_many :categorizations
 has_many :categories, through: :categorizations
Category.rb

  has_many :categorizations
  has_many :questions, through: :categorizations
分类.rb

 belongs_to :question
 belongs_to :category
现在,我可以转到localhost:3000/categories,查看所有类别的列表,其中包含问题。然而,尽管分类很重要,但并不实用,因为由于所问问题的性质,加州的人不太可能回答有关纽约的问题。因此,我希望问题也能按位置过滤。我猜设置URL的最好方法是这样

localhost:3000/state/ny/categories
get locations/:state/categories => "categories#index"
get locations/categories => "categories#index"
我知道我可以通过创建嵌套管线来实现这一点(例如,如果我创建了位置资源)

因此,虽然我最初将位置存储为问题模型上的字段,但现在我创建了一个位置模型(如果“State”是保留字,我对此不确定)。是的

还做了嵌套路由,这样我就可以按状态过滤类别

  resources :locations do
        resources :categories 
  end 
但是,您会注意到,我没有在位置和类别之间创建关联,因此如果我转到此路线

http://localhost:3000/locations/ny/categories
如果index.html.erb查看页面显示每个类别存在多少问题

<% @categories.each do |category| %>
  <div class="category">
    <h5><%= link_to category.name, category %></h5>
    <%= pluralize category.questions.size, "question" %>
  </div>
<% end %>
我想你能看到我在做什么。你能建议我该怎么做吗

例如,我是否应该在位置和类别之间创建关联,如果是的话,它将如何与我拥有的连接模型一起工作?它是否可以属于其他三个模型。或者我应该如何过滤问题或按位置分类列出的问题


如果你能提供一些建议,谢谢你

我认为当您有独特的需求时,不应该使用嵌套资源进行路由。我会像这样设置路由

localhost:3000/state/ny/categories
get locations/:state/categories => "categories#index"
get locations/categories => "categories#index"

categories#index
中,我将检查
是否参数[:state].nil?
基于此,您可以决定是否在检索查询中按状态进行筛选,并且视图将保持不变

在嵌套路由就位时,筛选不会自动进行,您仍然必须手动进行。嵌套路由的存在是为了使事情更易于管理,以及增强用户的体验,而不是为您做繁重的工作。因此,在您的情况下,在您看来,您需要将获取计数的代码更改为以下内容:

category.questions.where(location_id: params[:location_id]).size
您正在使用通过URL传入的
:location\u id
进行过滤的位置。不过,这里还有几个其他问题:首先,这种逻辑不应该出现在视图中,而可能出现在您的模型中;更严重的是,默认情况下,rails需要在url中使用位置的
:id
,而不是名称/缩写,因此您需要路由为
/location/1/categories
,而不是
/locations/ny/categories
(尽管有一些宝石可以让您绕过此要求)

category.questions.where(location_id: params[:location_id]).size