重用rails上的视图
Posted
技术标签:
【中文标题】重用rails上的视图【英文标题】:re-use views on rails 【发布时间】:2012-09-26 23:30:04 【问题描述】:我找不到使用其他视图的方法。
我想我可以用这个例子更好地解释它:我有两个控制器,IndexController
和 UserController
。用户控制器有一个名为 login
的操作,其视图呈现登录表单并在其表单中的帖子发生时验证用户。
在IndexController
中,有一个名为home
的操作会呈现主页视图。在这个视图中,我想渲染loginform
,但我想重新使用用户/登录视图。
在我使用过的几乎所有框架中,都有一种方法可以调用另一个控制器操作,以重用和隔离逻辑。
我发现,在 Rails 中,有一个助手 render
,我可以通过以下方式调用它:
render 'user/login'
或
render :template => 'user/login'
在这两种情况下,我只会收到诸如“路由索引/登录不存在”或“控制器索引必须登录操作”之类的错误。此外,我将登录视图文件名设置为login
或_login
。 (我读到它用于局部视图。)
【问题讨论】:
使用局部视图并将它们包含在您的标准视图中 默认的部分模板目录是RAILS_ROOT/app/views/shared
。
【参考方案1】:
您可以通过在您的视图文件夹中创建一个共享文件夹并将登录表单创建为部分来做到这一点。
所以你的登录部分可能是这样的。
/app/views/shared/_loginform.html.erb:
<div id="loginform">
<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
<%= f.text_field :email %>
<%= f.password_field :password %>
<%= f.submit "Login" %>
<% end %>
<div id="loginlinks">
<%= link_to "Become a member", new_member_registration_path %> <br />
<%= link_to "Forgot Password?", new_member_password_path %>
</div>
</div>
那么在您看来,只需调用:
<%= render "shared/loginform" %>
【讨论】:
谢谢,它非常有用,但我想我会使用 gylaz 提出的模板惯性。【参考方案2】:你应该看看 Railscast:“#269 Template Inheritance”。
从 Rails 3.1 开始,控制器继承现在也适用于视图。这比旧的“共享文件夹”策略更受欢迎。
简而言之,您将共享部分放在 app/views/application
中,然后您可以在资源特定的视图目录中覆盖它们(例如 app/views/users
)。
【讨论】:
以上是关于重用rails上的视图的主要内容,如果未能解决你的问题,请参考以下文章