Ruby on rails 尝试按rails中的字符串属性筛选结果

Ruby on rails 尝试按rails中的字符串属性筛选结果,ruby-on-rails,scope,Ruby On Rails,Scope,我对Rails比较陌生,我正在尝试从头开始创建一个烹饪书应用程序/站点,我不遵循任何教程或类似的内容。无论如何我仍然在该网站的早期阶段,但我现在的部分,我想显示一个索引列表的所有不同种类的食谱。但我想筛选列表,例如: 如果我点击导航栏上的“蔬菜”按钮,我想进入一个只显示不同蔬菜食谱的索引页面 我已经在菜谱中添加了一个字符串属性,称为“category”,这样我就能够区分肉类、海鲜、家禽、开胃菜和蔬菜菜谱。我的目标是只需要一个控制器“recipes”,并且在索引操作中能够有条件地过滤参数。这样就可

我对Rails比较陌生,我正在尝试从头开始创建一个烹饪书应用程序/站点,我不遵循任何教程或类似的内容。无论如何我仍然在该网站的早期阶段,但我现在的部分,我想显示一个索引列表的所有不同种类的食谱。但我想筛选列表,例如:

如果我点击导航栏上的“蔬菜”按钮,我想进入一个只显示不同蔬菜食谱的索引页面

我已经在菜谱中添加了一个字符串属性,称为“category”,这样我就能够区分肉类、海鲜、家禽、开胃菜和蔬菜菜谱。我的目标是只需要一个控制器“recipes”,并且在索引操作中能够有条件地过滤参数。这样就可以按食物的“类别”来过滤列表。但我不确定如何着手这样做

这是我的食谱控制器:

class RecipesController < ApplicationController
  def index
    @recipes = Recipe.all
  end

  def show
     @recipe = Recipe.find(params[:id])
  end

  def new
  end

  def edit
  end

end
以下是包含导航栏的应用程序布局文件:

<!DOCTYPE html>
<html>
<head>
  <title>Mrs. P's Cookbook</title>
  <link href='https://fonts.googleapis.com/css?family=Mate+SC' rel='stylesheet' type='text/css'>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  <%= csrf_meta_tags %>
</head>
<body>
  <div class="top-banner">
   <h1 class="banner-logo"> <%= link_to "Mrs. P's Cookbook", root_path %></h1>
   <nav>
    <%= link_to "POULTRY", poultry_path, class: "nav-link" %> |
    <%= link_to "MEAT", meat_path, class: "nav-link" %> |
    <%= link_to "SEAFOOD", seafood_path, class: "nav-link" %> |
    <%= link_to "APPETIZERS", appetizers_path, class: "nav-link" %> |
    <%= link_to "VEGETABLES", vegetables_path, class: "nav-link" %> |
    <%= link_to "ABOUT", about_path, class: "nav-link" %>
  </nav>

        <% if current_user %>
          Hello <%= current_user.email %>! <%= link_to "Sign out", destroy_user_session_path, method: :delete %>
        <% else %>
          <%= link_to "Sign In", new_user_session_path %> or
          <%= link_to "Sign Up", new_user_registration_path %>
        <% end %>
  </div>
<div class="white-field">
  <%= yield %>
    </div>
</body>
</html>
我有不同的类别视图,蔬菜、肉类、家禽、海鲜和开胃菜都在菜谱视图文件夹中。所有的视图都是空的,除了一些文字只是说“蔬菜食谱将列在这里”,“肉类食谱将列在这里”,“海鲜食谱将列在这里”,等等


我知道我的要求可能很高,所以你们能提供的任何帮助我都将非常感激。如果您需要更多信息,请告诉我。

我认为您需要使用一些教程,这样您将看到最佳实践等等。我还认为你应该读一些关于关系数据库的好书

  • 使用
  • 创建类别表。配方属于:类别。类别有很多:食谱。检查
  • 如何获取你可以查看的食谱(比如Recipe.where(category_id:params[:id])
  • 也要查一下

  • 使用这样的命名范围

    class Recipe < ActiveRecord::Base
    
    scope :by_category, lambda {|cat|
        where(category: cat)
    }
    ...
    end
    
    您还可以执行以下操作:

    scope :vegetables, lambda {
        where(category: "Vegetables")
    }
    
    然后打电话

    Recipe.vegetables 
    

    您的路由应该与控制器中的函数一致,因此当您有到“食谱#肉”的路由时,控制器将查找“肉”函数和“肉”视图

    我会删除这些路线,并有一个叫

    'get recipe/:recipe' 
    
    并将该参数(字符串)传递给show函数。 通过这种方式,您可以访问以下特定配方:

    @recipes = Recipe.where("category = ?", params[:recipe])
    

    我想出了两个可能的解决方案(在众多的解决方案中):)

    解决方案1 一种解决方案可以是使用查询字符串。路由文件将是

    Rails.application.routes.draw do
      resources :recipes
    
      devise_for :users
    
      get 'about' => 'welcome#about'
    
      root to: 'welcome#index'
    
    end
    
    现在以类别作为参数创建链接。在你看来:

    ...
      <nav>
        ['poultry','meat','seafood','appetizers','vegetables'].each do |category|
          <%= link_to category.upcase, 
                      recipes_path(category: category), 
                      class: "nav-link" %> |
        end
        <%= link_to "ABOUT", about_path, class: "nav-link" %>
      </nav>
    ...
    
    请注意,使用as::recipes_类别时,您可以使用recipes_类别(路径辅助对象来引用此路径

    现在我们需要将类别操作添加到配方控制器

    class RecipesController < ApplicationController
      ...
    
      def category
        @recipes = Recipe.where(category: params[:category])
      end
    
      ...
    end
    
    或者是一个类别的食谱

    @category = Category.find(2)
    @recipes = @category.recipes
    
    这真的取决于你想要实现什么。我希望我给了你一些关于这个论点的想法

    关于使用Slim的其他建议,我不同意。它只是语法糖,它不是标准的,而且会让你感到困惑:你能找到的大多数代码都有标准语法

    在使用其他工具之前先把手弄脏,这将使您更好地了解背后的机制,更好地了解该工具是否能解决您的需求,以及如何定制它

    我建议您阅读官方的rails指南、无数的博客和文章,并尝试阅读其他人编写的代码(感谢开源!)

    Rails.application.routes.draw do
      resources :recipes
    
      devise_for :users
    
      get 'about' => 'welcome#about'
    
      root to: 'welcome#index'
    
    end
    
    ...
      <nav>
        ['poultry','meat','seafood','appetizers','vegetables'].each do |category|
          <%= link_to category.upcase, 
                      recipes_path(category: category), 
                      class: "nav-link" %> |
        end
        <%= link_to "ABOUT", about_path, class: "nav-link" %>
      </nav>
    ...
    
    class RecipesController < ApplicationController
      def index
        @recipes = params[:category].blank? : Recipe.all :
                   Recipe.where(category: params[:category])
      end
    
      ...
    end
    
    Rails.application.routes.draw do
      get 'recipes/:category' => 'recipes#category', as: :recipes_category
      resources :recipes
      ...
    end
    
    class RecipesController < ApplicationController
      ...
    
      def category
        @recipes = Recipe.where(category: params[:category])
      end
    
      ...
    end
    
     ...
     <%= link_to category.upcase, 
                 recipes_category_path(category: category), 
                 class: "nav-link" %> |
     ...
    
    class Recipe < ActiveRecord::Base
      belongs_to :category
    end
    
    class Category < ActiveRecord::Base
      has_many :recipes
    end
    
    Category.all
    
    @category = Category.find(2)
    @recipes = @category.recipes