我正在学习Ruby on Rails,现在我已经创建了我的应用程序的移动版本。
我创建了模型与控制器之间的关系是一对一的。现在我想进行更改以从一个控制器管理三个模型。我已经阅读并观看了很多关于如何执行此操作的视频,但是当我尝试在我的应用程序中执行此操作时它不起作用。
型号:
class Subject < ActiveRecord::Base
has_many :pages
class Page < ActiveRecord::Base
belongs_to :subject
has_many :sections
class Section < ActiveRecord::Base
belongs_to :page
控制器:
class SubjectsController < ApplicationController
has_mobile_fu
layout "admin"
before_action :confirm_logged_in
def index
@subjects = Subject.newest_first
@pages = @subjects.pages.sorted
end
这是错误:
NoMethodError(未定义的方法
pages' for # <ActiveRecord::Relation::ActiveRecord_Relation_Subject:0x007fbbf3c9b218>): app/controllers/subjects_controller.rb:10:in
索引'
如果我保持每个模型由其控制器管理,该应用程序运行良好。现在问题就出现了,我想从一个控制器控制多个模型。
答案 0 :(得分:2)
绝对可以在单个控制器中使用多个模型。这里的问题是你正在调用一个对于活动记录关系不存在的方法。
活动记录关系通常是使用活动记录的查询中返回对象的集合。所以newest_first返回多个,而不只是一个。如果您想获取主题的所有页面并对其进行排序,您可以这样做:
@subjects = Subject.newest_first
@pages = @subjects.map(&:pages).flatten.sort { |a, b| a.title <=> b.title }
可以切换您要排序的属性。 map函数遍历每一个,并返回我在符号中传递的对象。它是:
的捷径@subjects.map { |subject| subject.pages }
flatten然后获取该活动记录关系数组并将其展平为单个数组。然后我只使用数组排序。
修改以下是使用数据库的方法:
@subjects = Subject.newest_first
@pages = Page.where.not(:subject_id => nil).order(:title)
答案 1 :(得分:1)
<强> MVC 强>
您将从中受益的是查看MVC Programming Pattern:
Rails因其与Model-View-Controller
模式的严格一致性而闻名,因为它的工作方式如下:
- 您向自己的应用发送请求
- Rails&#34;路线&#34;您对特定控制器/操作的请求
- 然后,控制器将整理您
中的数据Models
- 然后,控制器将呈现
view
以显示此数据
模型与控制器之间的关系是独家的;这意味着你不必从控制器等调用某些模型。
所以基本答案是不,您不需要从控制器调用单个模型。但是,您做需要确保您设置了正确的模型关联,如下面的说明所示:
<强>协会强>
这里需要注意的是,由于Ruby是object-orientated
(而Rails,由于构建在Ruby上,也是如此),它通常被认为是构建应用程序的最佳实践围绕对象
&#34;对象&#34;基本上是精心设计的变量(从Model
类构建),但是使OOP正常工作的模式非常重要 - 从Rails' routes
到控制器操作的所有内容都设计为object-ORIENTATED
每次启动Model
的实例时,Rails实际上都在构建object
供您使用。此对象允许您为对象调用/使用一系列属性/方法,允许您使用Rails创建所需的体验
-
底线 -
我高度建议您检查模型中的ActiveRecord Associations
(这将决定您是否需要调用单个model
):
#app/controllers/subjects_controller.rb
Class SubjectsController < ApplicationController
def index
@subjects = Subject.newest_first #-> good use of OOP
@posts = # this is where your error occurs (`.posts` is only an attribute of each `Subject` object instance, which is fixed using the accepted answer)
end
end
希望这能为您提供有关如何构建Rails应用程序的更多想法