渲染后实例变量不可用

时间:2013-02-08 14:43:36

标签: ruby-on-rails ruby-on-rails-3

我有一个注册和登录页面,其中包含已注册用户的一些图片。我有一个会话和用户控制器来分别登录和注册我的应用程序。

会话控制器

    def new
      @users = User.last(3)
    end

    def create
      user = User.find_by_email(params[:session][:email].downcase)
      if user && user.authenticate(params[:session][:password])
        sign_in user
        redirect_back_or user
      else
        flash.now[:error] = "Wrong email/password combination"
        render 'new'
      end
    end

然后我使用实例变量@user来显示lates 3个用户的图像。这也适用于我的用户控制器。我的“新”视图中有一部分slider

_slider.html.erb

    <% for user in @users do %>
            <div class="item">
                <%= image_tag user.photos.first.image.url(:large) %>
                <div class="carousel-caption">
                    <h4><%= user.name %></h4>
                    <p><%= user.tagline %></p>
                </div>
            </div>
    <% end %>  

这在注册和登录页面中都可以正常工作,直到注册/登录表单包含错误。我抛出了这个错误undefined method 'each' for nil:NilClass。我认为在渲染页面后@user变量不可用。

重新渲染新动作后,如何使其可用?或者我应该怎么做呢?谢谢

3 个答案:

答案 0 :(得分:1)

在else块上,您需要声明@users变量,因为您正在渲染新模板。

else
  @users = User.last(3)
  flash.now[:error] = "Wrong email/password combination"
  render 'new'
end

答案 1 :(得分:1)

每个http请求都是无状态的,并且不知道以前的值(无状态)。 因此,如果部分呈现它需要@users,新动作也需要@users。 那么,你需要的是在控制器before_filter中,或者从params [:xx]

设置/初始化@users对象
before_fiter: initiaze_values
def initialize_values
  @users = User.last(3)

end

答案 2 :(得分:0)

也许你忘了使用@:使用@user not user