链接到我/列表/搜索页面上的其他类别

时间:2017-02-04 17:36:02

标签: ruby-on-rails

我有以下路线:

resources :categories do 
  resources :subcategories
end 

看起来像这样(来自rake routes):

category GET    /categories/:id(.:format)   categories#show 

以下行动:

class CategoriesController < ApplicationController
  def index
    @categories = Category.all
    @campus = @categories[0]
    @community = @categories[1]
    @housing = @categories[2]
    @h2f = @categories[3]
    @free = @categories[4]
    @jobs = @categories[5]
    @talent = @categories[6]
    @personals = @categories[7]
    @sale = @categories[8]
    @services = @categories[9]
    @unboxing = @categories[10]
  end 

  def show
    @listings = Listing.where(category_id: params[:id]).order("created_at DESC")
    @category = Category.find(params[:id])
  end
end

我正在尝试链接到搜索页面上类别的每个类别(路径为/listings/search)。

我尝试了<%= link_to 'Sale', @listing.categories_path(@sale) %><%= link_to 'Sale', category_path(@sale) %>,但没有任何效果。

2 个答案:

答案 0 :(得分:0)

我假设您需要指向其中一个类别(Category#show)的链接,然后<%=link_to 'Sale', category_path(@sale)%>本身是正确的,但您需要实例化@sale。因此,假设您要列出所有类别,并且您的类别具有属性name,您可以执行类似

的操作
<%@categories.each do |c|%>
  <%=link_to "#{c.name}", category_path(c)%>
<%end%>

如果你只想要索引页面,它应该是categories_path,没有任何参数。

答案 1 :(得分:0)

(根据您发布的链接)看起来似乎是尝试在ListingsController操作的网页上添加这些链接,特别是listings#search,而不是category#show

我猜你正在做的路线看起来像这样:

配置/ routes.rb中

resources :listings do
  member do
    get 'search' => 'listings#search'
  end
end

应用程序/控制器/ listings_controller.rb

class ListingsController
  def search
    @matching_listings = Listings.something
  end
end

当您访问listings控制器search路由时,将不会执行其他控制器或控制器操作。因此,您添加到CategoriesController#index的代码将无法运行。

如果您要加载网站上其他操作的类别列表,例如categories#showlistings#search,则必须在特定操作方法中加载它们:

应用程序/控制器/ listings_controller.rb

class ListingsController
  def search
    @matching_listings = Listings.something
    @categories = Categories.order(:name)
  end
end

应用程序/视图/列表/ search.html.erb

<ul class='categories'>
  <% @categories.each do |category| %>
    <li><%= link_to(category.name, category_path(category)) %></li>
  <% end %>
</ul>

然而,这非常糟糕,因为您必须将其复制并粘贴到许多不同的操作中。

更好的方法是添加视图助手方法。通常你会在你想要添加它的特定控制器的帮助器中执行此操作,并且我将给出该示例。但您可以将其放在ApplicationHelper中,以便所有控制器中的模板都可以使用它。

应用程序/助手/ listings_helper.rb

module ListingsHelper
  def all_categories
    Category.order(:name)
  end
end

应用程序/控制器/ listings_controller.rb

class ListingsController
  def search
    @matching_listings = Listings.something
  end
end

应用程序/视图/列表/ search.html.erb

<ul class='categories'>
  <% all_categories.each do |category| %>
    <li><%= link_to(category.name, category_path(category)) %></li>
  <% end %>
</ul>

最后,我想提一下,加载类别列表的方式是非常糟糕。您没有指定排序顺序,因此可以按任何顺序返回类别记录。我的例子是为了让他们不依赖于特定顺序的记录而构建的,因为我遍历记录数组。如果您不希望它们按字母顺序排列,您应该将一个整数列添加到您可以排序的categories表中,以便您可以通过更改这些值来控制顺序。