我正在使用ROR构建我的第一个应用程序,由于我对MVC的理解而偶然发现了一些问题
我有一个页面来添加一个新项目,这很好用,rails魔术般地将它连接到项目控制器,并且通过魔术它知道在方法'new'中查找该页面被称为new。
但是这一层令我感到困惑,因为我现在需要创建一个不同版本的新功能,但具有不同的外观,以便对application.html.erb使用不同的布局
所以我尝试创建new.html.erb的副本并创建bookmarklet.html.erb - 两者都包含完全相同的代码:表单的链接。但是当然bookmarklet会在我身上出错,因为它在控制器中没有那个链接 - 我如何'连接'书签,以便我可以调用新方法,以便它可以以类似于相同的新方式运行。 html.erb
另外,我怎么能告诉新的bookmarklet.html.erb忽略application.html.erb并从另一个文件中获取它的布局?
提前致谢
答案 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,如果你这样做,他们会非常清理你的代码。