模型可以在Rails中访问哪些信息?

时间:2011-01-12 19:17:53

标签: ruby-on-rails activerecord

在Ryan Bates的first episode on complex forms中,他将以下内容添加到模型中:

# models/project.rb
has_many :tasks

def task_attributes=(task_attributes)
  task_attributes.each do |attributes|
    tasks.build(attributes)
  end
end

我以前从未想过这个,但Project模型如何知道哪个Project实例的“任务”?这是来自has_many协会吗?是这样,当项目正在运行并且我正在查看项目时,那就是“活动”对象,因此project.rb知道我们所指的是哪个Project对象,所以它知道任务实际上是some_current_project.tasks? (我显然在这里抓住稻草。)

另外,如果有人会给我一些解释其他问题的参考资料,我真的很感激。

我希望我的问题很明确。如有需要,请在评论中提出更多说明。

请注意:我知道Active Record处理CRUD操作,并且该对象对应于表格中的行等。这些只是Active Record 的描述。我正在寻找项目运行时的工作方式。我现在也构建了MVC,但我似乎无法找到有关Rails的哪些信息发送的详细说明。

1 个答案:

答案 0 :(得分:1)

(不确定我完全理解你的问题,如果是这样的话,请随时告诉我。)

rails模型基本上是一个持久化到数据库的ruby类。所以它在很大程度上就像一个普通的ruby对象,混合了一些数据库魔法。

告诉rails要加载哪个项目实例(例如,通过提供id),然后从数据库加载数据。

然后,当您调用project.tasks时,魔法发生时:Project模型没有tasks方法,因此它将触发ruby的method_missing方法。然后,它会将关联的记录加载到模型实例中,并通过rails对象提供对它们的访问。

由于project有许多task,因此rails知道它应该查看tasks数据库并加载project_id等于project的行} model的id属性。

简而言之,ruby元编程和猴子修补可能性使得rails的魔法成为可能。


(编辑路由问题。)

如果要编辑项目编号13,请转到类似www.mysite.com/projects/13/edit的URL。如果你查看routes.rb目录中的config,你会看到(在Rails3中)resources :projects Rails所做的是为你设置各种路径。在魔术背后,编辑路径看起来像

get '/projects/:id/edit' => 'projects#edit'

这基本上说“当用户想要查看www.mysite.com/projects/13/edit时,请将他发送到edit控制器中的projects操作并设置{{1} }参数到那个地方的值。

然后在您的控制器中,您将使用

加载相应的项目
id

以类似的方式,你可以这样做(这是一个愚蠢的例子):

@project = Project.find(params[:id]) 中,输入

routes.rb

然后在你的控制器

get '/projects/:id/edit_name/:name' => 'projects#edit'

因此rails基本上使用魔术将URL中的值分配给您可以在控制器中使用的参数。您可以在此处详细了解路由:http://guides.rubyonrails.org/routing.html