【问题标题】:Rail Application Model/Controller & Routrs organisation铁路应用模型/控制器和路线组织
【发布时间】:2011-02-19 18:11:37
【问题描述】:

我正在尝试开发这个具有以下目标的 Rails 应用程序:

/foods/ - 呈现食物类别列表(例如:面包、乳制品、饼干...等)
/foods/breads/ - 呈现食物类别“面包”内的所有食物
@987654323 @ - 呈现食物属性的详细视图(在本例中为百吉饼)。

目前我有两个带有关联控制器的模型:

Foods - 包含食物列表(例如:百吉饼、米饭、吐司、浓茶饼干...等)并设置为 belongs_to 单个 Food Cat

Food Categories - 类别列表,如“乳制品”、“面包”...等 & 设置为 has_many :foods

我真的很纠结如何实现我的目标。我真的需要关于路由、控制器操作和视图的建议。

有什么建议吗?

【问题讨论】:

  • 你应该学习基础知识(例如在 railsforzombies.org 上),然后创建。

标签: ruby-on-rails ruby-on-rails-3 controllers


【解决方案1】:

在您的 routes.rb 文件中,我会执行以下操作:

match 'foods' => 'FoodCategories#index'
match 'foods/:category' => 'Foods#index'
match 'foods/:category/:name' => 'Foods#show'

然后我会按类别为 Foods 创建一个范围:

class Food
  scope :by_category, lambda{ |category| joins(:categories).where('categories.name = ?', category) }
end

然后我将在您的 FoodsController 中执行 2 个操作:

class FoodsController
  def index
    @foods = Food.by_category(params[:category])
  end

  def show
    @foods = Food.by_category(params[:category]).where('foods.name = ?', params[:name])
  end
end

在您的 FoodCategoriesController 中执行一个操作:

class FoodCategories
  def index
    @categories = Category.where(name: params[:category])
  end
end

这应该让您不得不实现 3 个视图:类别/索引、食物/索引和食物/节目。

【讨论】:

    【解决方案2】:

    你应该有一个 FoodsController 和一个 FoodCategoriesController 来处理 FoodFoodCategory 模型。 如果您遵循 RESTful 方法,那么实现您列出的 url 配置所需的路由如下:

    match '/foods' => 'food_categories#index'
    match '/foods/:category_id' => 'food_categories#show'
    match '/foods/:category_id/:food_id' => 'foods#show'
    

    您的 FoodCategoriesController 将具有方法 index 方法,该方法通过执行 FoodCategory.find :all 查找列出所有类别,以及 >show 方法将根据提供的:category_id 查找 FoodCategory 并通过 has_many 关系显示与其关联的所有食物。 您的 FoodController 将有一个 show 方法,该方法至少会采用 :food_id 并查找与其关联的 Food 实例。 :category_id 在这里并不是必需的,但它是一个不错的路由糖。

    【讨论】:

    • 哇,这些答案看起来都很棒。我明天将深入审查并实施。你们都是救生员!
    • 谁能解释为什么 link_to food_category.name, foods_path(food_category) 产生:localhost:3000/foods.983340129
    • 这一切都取决于你的食物路线是如何定义的。
    • match '/foods/' => 'food_categories#index', :as => :foods 这对我来说真的没有意义。我已经阅读过,我确信我做得对。
    • 好吧,我设法通过命名我的路线来完成这项工作> 'food_categories#show', :as => :foods_list 匹配 '/foods/:food_category_id/:food_id' => 'foods#show', :as => :foods_detail
    猜你喜欢
    • 2016-01-22
    • 2017-07-24
    • 2013-04-03
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多