在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的哪些信息发送的详细说明。
答案 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