2011-09-04 104 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