仍然很难使用RoR MVC方法

时间:2011-01-29 03:52:01

标签: ruby-on-rails ruby

我认为应该公正地陈述我认为我所知道的以及我所做的事情:

1)我创建了应用程序并进行了第一次数据库迁移;我知道有我的开发,测试和生产数据库。 dev db有一个名为'wines'的表。

2)我制作了一个创建必要文件的脚手架。

3)设置基本索引/更新/销毁方法,我可以浏览页面。

4)从我收集的内容来看,ActiveRecord类“Wine”会自动从数据库继承属性吗?每列都是一个属性,表'wines'中的每一行都是一个可能实例化的对象,可以从wine_controller脚本调用。

我现在遇到的问题是我想创建一个所有控制器都使用的通用布局。唯一会改变的是页面标题,可能还有一些< link>标题中的标签,< body>属性(最有可能的javascript onload事件)以及< body>中的任何内容标签

我发现自己正在寻找能够做我想做的功能(比如“favicon_link_tag”,“stylesheet_link_tag”和“auto_discovery_link_tag”......)但是找不到合适的地方给他们!我知道这与我对事物的执行/继承方式缺乏了解有关。例如,如果我在application_controller.rb中声明@pageTitle并在ApplicationHelper中使用@pageTitle则不起作用。甚至在application_controller.rb中使用“stylesheet_link_tag”会引发错误。我只是没有得到什么。

每个事物在时间执行,范围等方面如何与另一个事物相关?

1 个答案:

答案 0 :(得分:5)

在“app / views”目录中有一个名为“layouts”的文件夹。默认情况下,应该有一个“application.html.erb”文件,但如果没有,你可以创建它。

您的“应用程序”布局文件是任何视图使用的默认布局文件。但是,如果您希望特定控制器使用其他视图,则可以覆盖此视图。请参阅此railscastthis one也很有帮助。

要理解的主要内容是,任何特定视图中的内容都会显示在应用程序布局中yield方法出现的位置。主'yield'块获取由控制器操作指定的视图文件,但您可以在任何视图中标记任何内容以将其传递给另一个yield块。例如,您提供的“标题”示例可以传递到应用程序布局的头部。有关详细示例,请参阅此railscast

有关更多信息,请阅读Rails Guide,您可能需要考虑选择Rails入门书。

我用“Beginning Rails 3”弄湿了脚,这是该框架的一个非凡的介绍。这本书有几天了,这对我来说都很有意义,而且我的发展速度比以往任何时候都快。一旦你了解它,Rails就会晃动,但绝对值得翻阅一本书。

请继续提问,如果可以,我会帮忙:)。

-EDIT-要回答关于控制流的问题,它基本上是这样的:

  1. 您的浏览器会发送特定网址的GET请求。

  2. 路由器接收该请求,将其与控制器操作匹配,触发该控制器操作,并向控制器提供与请求相关的任何参数。例如:如果您请求example.com/posts/123?color=red,则会触发SHOW的{​​{1}}操作,并会传递{:color => “红色”}到params哈希。您可以使用posts_controller

  3. 访问它
  4. 控制器动作完成它的任务,当它完成时它会渲染输出。默认情况下,它会呈现params[:color]中的任何视图,并且将与适合请求的扩展名匹配(即,AJAX请求将触发app/<controller_name>/<action_name>,GET请求将触发<action_name>.js.erb

    • 您可以使用<action_name>.html.erb方法覆盖此方法,例如将render传递给使用FooController视图的渲染,使用Bar操作而不是当前操作。

    • 请注意,无论您渲染什么,视图可用的数据都是路由器触发的特定控制器操作中的数据,而不是“通常”呈现该视图的控制器操作。

      < / LI>
  5. 使用调用它的控制器中的数据解析视图文件。如果您有任何render 'foo/bar'方法,则content_for块内的视图代码将转到您告诉它的位置,否则其他所有内容都将转到content_for布局中的主YIELD块(或控制器指定的任何布局。

  6. 解析应用程序布局,并将视图中的内容插入适当的区域。

  7. 该页面将提供给用户。

  8. 这在某些方面是简化,但我认为它回答了你的问题。再次,随意问:)