0

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

会话控制器

    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 来显示最近 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渲染页面后该变量不可用。

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

4

3 回答 3

1

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

else
  @users = User.last(3)
  flash.now[:error] = "Wrong email/password combination"
  render 'new'
end
于 2013-02-08T14:48:00.943 回答
1

每个 http 请求都是无状态的,不知道之前的值(无状态)。因此,如果部分被渲染,它也需要@users新的动作@users。因此,您需要在控制器中或从 params[:xx]before_filter设置/初始化对象@users

before_filter: initialize_values
def initialize_values
  @users = User.last(3)
end
于 2013-02-08T15:22:54.197 回答
0

也许你忘了使用@:使用@user 而不是用户

于 2013-02-08T14:44:40.757 回答