由于与控制器的链接,相同文件的行为会有所不同

时间:2011-01-13 14:17:36

标签: ruby-on-rails layout controller

我正在使用ROR构建我的第一个应用程序,由于我对MVC的理解而偶然发现了一些问题

我有一个页面来添加一个新项目,这很好用,rails魔术般地将它连接到项目控制器,并且通过魔术它知道在方​​法'new'中查找该页面被称为new。

但是这一层令我感到困惑,因为我现在需要创建一个不同版本的新功能,但具有不同的外观,以便对application.html.erb使用不同的布局

所以我尝试创建new.html.erb的副本并创建bookmarklet.html.erb - 两者都包含完全相同的代码:表单的链接。但是当然bookmarklet会在我身上出错,因为它在控制器中没有那个链接 - 我如何'连接'书签,以便我可以调用新方法,以便它可以以类似于相同的新方式运行。 html.erb

另外,我怎么能告诉新的bookmarklet.html.erb忽略application.html.erb并从另一个文件中获取它的布局?

提前致谢

2 个答案:

答案 0 :(得分:0)

更好的思考方法是从控制器开始,而不是查看html.erb文件。因此,控制器中的每个公共方法实际上都是站点中的页面或操作。当您需要新的操作或页面时,首先将方法添加到控制器。然后创建相关的视图文件。

所以在你的控制器中你需要像:

def bookmarklet
  @item = Item.new(params[:item])
  @item.save
  render :template => "items/bookmarklet.html.erb", :layout => "different_layout.html.erb"
end

通常,您不需要在控制器中手动调用渲染,但由于您需要与默认布局不同的布局,因此需要使用渲染来指定它。

答案 1 :(得分:0)

魔术发生在路线上。 Rails使用称为RESTful路由的东西,它采用HTTP动词并为其分配标准动作。 new动作是HTTP中的GET请求,如果你正在使用脚手架或跟随REST,将会调用ruby来在控制器中构建一个新对象,作为一个实例变量,这样你就可以在你的图。

你必须告诉你想要破坏这种安排的铁路路线,并让/ items / bookmarklet在控制器中使用。

在您的routes.rb文件中,将resources :items替换为

resources items do
  member do
    get 'bookmarklet'
  end
end

在您的控制器中:

def bookmarklet
  @item = Item.new
  render :template => "bookmarklet", :layout => "different_layout" # or you can put this on the top of the controller, which is my style, but whatevs.
end

你应该查看partials,如果你这样做,他们会非常清理你的代码。