Ruby on rails 尝试通过嵌套路由筛选数据
我有一个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
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