在rails上重用视图

时间:2012-09-26 23:30:05

标签: ruby-on-rails ruby views

我找不到使用其他视图中的视图的方法。

我想我可以通过这个例子更好地解释它:我有两个控制器,IndexControllerUserController。用户控制器有一个名为login的操作,其视图呈现登录表单,并在其表单中的帖子发生时验证用户。

IndexController中,有一个名为home的操作会呈现主页视图。在此视图中,我想呈现loginform,但我想重新使用用户/登录视图。

在我使用的几乎所有框架中,有一种方法可以调用另一个控制器操作,以便重用和隔离逻辑。

我发现,在Rails中,有一个助手render可以通过以下方式调用:

render 'user/login'

render :template => 'user/login'

在这两种情况下,我只会收到“路由索引/登录不存在”或“控制器索引必须登录操作”等错误。此外,我将登录视图文件名设置为login_login。 (我读过它用于部分视图。)

2 个答案:

答案 0 :(得分:4)

您可以通过在views文件夹中创建共享文件夹并将登录表单创建为部分文件夹来完成此操作。

所以你的登录部分可能是这样的。

/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"  %>

答案 1 :(得分:1)

你应该看看Railscast:“#269 Template Inheritance”。

从Rails 3.1开始,控制器继承现在也适用于视图。这比旧的“共享文件夹”策略更受欢迎。

简而言之,您将共享的部分内容放在app/views/application中,然后您可以在资源特定的视图目录中覆盖它们(例如app/views/users)。