2012-02-16 66 views
5

我試圖在我的application.html.erb頭中包含一個登錄名(用戶名/密碼)。我收到此錯誤:Rails 3渲染部分從另一個控制器(錯誤:ActionView :: MissingTemplate)

Missing partial /login with {:handlers=>[:rjs, :builder, :rhtml, :erb, :rxml], :locale=>[:en, :en], :formats=>[:html]} in view paths "/app/views" 

,當我在做我的application.html.erb此調用發生這種情況:

<%= render '/login' %> 

「/登錄」我的routes.rb中被定義爲:

match '/login' => "sessions#new", :as => "login" 

更新:這是我的會話控制器:

class SessionsController < ApplicationController 

    def create 
    if user = User.authenticate(params[:email], params[:password]) 
     session[:user_id] = user.id 
     user.last_login = Time.now 
     user.save 
     redirect_to root_path, :notice => "login successful" 
     else 
     flash.now[:alert] = "invalid login/password combination " # don't show pass + params[:password] 
     #render :action => "new" 
     redirect_to login_path, :notice => "wrong user pass" 
     end 
    end 

    def destroy 
    reset_session 
     redirect_to root_path, :notice => "successfully logged out" 
    end 

end 

我在其他帖子中看到,這可能是由於未在控制器操作中定義變量,但由於這是一個會話,並且位於application.html.erb(application_controller.rb)中,所以我沒有確定如何做到這一點。任何人都知道如何做到這一點?謝謝!

+0

你的部分在哪裏?而且,爲什麼你在渲染中分配路徑路徑? – prasvin 2012-02-16 06:00:25

+0

部分位於views/sessions/new.html.erb中。之所以我在我的調用中使用'/ login'來渲染,是因爲我想它會渲染views/sessions/new.html.erb部分。 – botbot 2012-02-16 06:15:07

+0

查看已更新的答案 – prasvin 2012-02-16 06:37:12

回答

9

<%= render "sessions/login", :@user => User.new %>

將呈現在視圖/會話登錄局部會話的查看,即「_login.html.erb」和實例@user到新的用戶,以便它可以直接在該部分被引用爲:

form_for @user, :url => sessions_path do |f| 
    f.text_field :email 
+0

我更新了我的帖子以顯示我的會話控制器代碼。我很喜歡這個,所以我不明白爲什麼我必須傳遞一個:@user => User.new?是這樣的: if user = User.authenticate(params [:email],params [:password]) 會不會在會話控制器失敗?我正在跟着一個教程,我不得不向我的/ sessions文件夾添加一個new.html.erb,但現在我看着我的控制器,它只有一個創建和一個銷燬方法。有點混亂。 – botbot 2012-02-16 07:11:00

+0

如果你正在嘗試使用這種方式創建某種認證系統,我真的推薦使用Devise gem https://github.com/plataformatec/devise。它超級簡單,非常有幫助。它自己創建會話,提供有用的幫助程序(如current_user)並讓我們免於管理會話麻煩。我寧願將驗證部分留給Devise。這樣,如果用戶未通過身份驗證,Devise會將其重定向到登錄頁面。現在,您可以根據需要設計登錄頁面,並根據需要呈現登錄名(用戶名/密碼)。 – prasvin 2012-02-16 07:50:22

+1

現在,直接回答你的問題,我建議在視圖/會話中創建一個部分'_login.html.erb'。然後,如上所述呈現登錄部分。傳遞'@ user'的原因是部分的'@ user'形式,所以用'User.new'實例化。 如上所示,爲用戶填寫部分表單,其中包含電子郵件,密碼和(如果需要)其他字段。當表單被提交時,參數被傳遞給會話#創建表單中指定的url的becoz。代碼未經測試,但應該有所幫助。 但是,請先看看Devise先使用它,如果它適合我​​們的要求使用。 – prasvin 2012-02-16 08:06:05

0

檢查的文件擴展名在我的情況的文件擴展名是RHTML,我把它改爲html.erb

現在它的工作正常。

注:

這與RHTML擴展文件在軌< = 3.0.10工作的罰款。但停止工作在rails 3.1.12。所以我改變了它的擴展,如上所述。

相關問題