2011-09-04 65 views
1

我開始接觸軌,所以這是一個非常基本的問題渲染。我試圖呈現在主頁的登錄表單(authlogic),使用此代碼:Rails3中:從另一個控制器

的意見/家/ index.html.haml:

%p 
    This is the home page...! 

- if current_user 
- else 
    = render :template => 'user_sessions/new' 


user_sessions_controller:

class UserSessionsController < ApplicationController 
    before_filter :require_no_user, :only => [:new, :create] 
    before_filter :require_user, :only => :destroy 

    def new 
    @user_session = UserSession.new 
    end 

    def create 
    @user_session = UserSession.new(params[:user_session]) 
    if @user_session.save 
     flash[:notice] = "Login successful!" 
     redirect_back_or_default user_controls_url 
    else 
     render :action => :new 
    end 
    end 

    def destroy 
    current_user_session.destroy 
    flash[:notice] = "Logout successful!" 
    redirect_back_or_default home_url 
    end 
end 


views/user_sessions/new.html.haml

= form_for @user_session, :url => {:action => "create"} do |f| 
    = f.error_messages 
    %div 
    = f.label :login 
    = f.text_field :login 
    %div 
    = f.label :password 
    = f.password_field :password 
    %div 
    = f.check_box :remember_me 
    = f.label :remember_me 
    %div 
    = f.submit "Login" 


型號/ user_session.rb

class UserSession < Authlogic::Session::Base 

    def to_key 
    new_record? ? nil : [ self.send(self.class.primary_key) ] 
    end 

    httponly true 
    secure true 
end 


當我瀏覽網頁時,我得到:

ActionView::Template::Error (undefined method `model_name' for NilClass:Class): 
1: = form_for @user_session, :url => {:action => "create"} do |f| 
2: = f.error_messages 
3: %div 
4:  = f.label :login 
    app/views/user_sessions/new.html.haml:1:in `_app_views_user_sessions_new_html_haml___182031841_97682750' 
    app/views/home/index.html.haml:6:in `_app_views_home_index_html_haml__679857083_97787190' 

我在做什麼錯了,我該如何解決?

非常感謝您的幫助。

回答

2

在您的代碼中,當您訪問連接到user_sessions/newnew操作時,正在創建@user_session;當你去index動作就不會創建。

當您從index操作中呈現user_sessions/new模板時,ERB/HAML正在查找@user_session的實例並找不到它,因此出現此錯誤。

所以,你可以實例@user_session這樣的:

#Note: The <%%> is ERB code (please adjust it for the syntax used in HAML) 
<% @user_session = UserSession.new if @user_session.nil? %> 

= form_for @user_session, :url => {:action => "create"} do |f| 
... 

或者,你也可以做到這一點在index行動本身,雖然這將是更好地從index行動保持它,而是做如上(例如,如果你想呈現一些其他動作模板以及 - 然後你會不必要地重複代碼)

+0

我以前嘗試過這一點,但顯然做得不對。現在它工作了!非常感謝!! – suruen