Rails 4.0多个模型和一个控制器

时间:2014-08-06 01:12:14

标签: ruby-on-rails

我正在学习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索引'

如果我保持每个模型由其控制器管理,该应用程序运行良好。现在问题就出现了,我想从一个控制器控制多个模型。

2 个答案:

答案 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

enter image description here

Rails因其与Model-View-Controller模式的严格一致性而闻名,因为它的工作方式如下:

  
      
  • 您向自己的应用发送请求
  •   
  • Rails&#34;路线&#34;您对特定控制器/操作的请求
  •   
  • 然后,控制器将整理您Models
  • 中的数据   
  • 然后,控制器将呈现view以显示此数据
  •   

模型与控制器之间的关系是独家的;这意味着你不必从控制器等调用某些模型。

所以基本答案是,您不需要从控制器调用单个模型。但是,您需要确保您设置了正确的模型关联,如下面的说明所示:


<强>协会

这里需要注意的是,由于Ruby是object-orientated(而Rails,由于构建在Ruby上,也是如此),它通常被认为是构建应用程序的最佳实践围绕对象

&#34;对象&#34;基本上是精心设计的变量(从Model类构建),但是使OOP正常工作的模式非常重要 - 从Rails' routes到控制器操作的所有内容都设计为object-ORIENTATED

enter image description here

每次启动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应用程序的更多想法