2012-09-26 44 views
1

我無法找到使用其他視圖的視圖的方法。在軌道上重複使用視圖

我想我可以用這個例子更好地解釋它:我有兩個控制器,IndexControllerUserController。用戶控制器有一個名爲login的操作,其視圖呈現登錄表單並在發生表單發佈時驗證用戶。

IndexController中,存在一個名爲home的操作,該操作呈現主頁視圖。在這個視圖中,我想渲染loginform,但我想重新使用用戶/登錄視圖。

在幾乎所有與我一起工作的框架中,都有一種調用另一個控制器動作的方法,以重新使用和隔離邏輯。

我發現,在Rails中,有一個輔助render,我可以通過以下方式撥打:

render 'user/login' 

render :template => 'user/login' 

在這兩種情況下,我只得到「錯誤路由索引/登錄不存在「或」控制器索引必須登錄操作「。此外,我將登錄視圖文件名設置爲login_login。 (我讀的是用於部分視圖。)

+0

使用partials並將它們包括在您的標準視圖中 – apneadiving

+0

默認的部分模板dir是'RAILS_ROOT/app/views/shared'。 – halfelf

回答

1

你應該Railscast看一看: 「#269 Template Inheritance」。

由於Rails 3.1,控制器繼承現在也適用於視圖。這比舊的「共享文件夾」策略更受歡迎。

簡而言之,您將您的共享部分放在app/views/application中,那麼您可以在資源特定的視圖目錄(例如app/views/users)中覆蓋它們。

+0

謝謝,這是非常有用的,我會實施這種方法 –

4

您可以通過在視圖文件夾中創建共享文件夾並創建登錄表單作爲部分。

因此,您的登錄部分可能是這樣的。

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

謝謝,這是非常有用的,但我想我會使用Gylaz提出的模板ineritance。 –