我有一个注册和登录页面,其中包含已注册用户的一些图片。我有一个会话和用户控制器来分别登录和注册我的应用程序。
会话控制器
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
变量不可用。
重新渲染新动作后,如何使其可用?或者我应该怎么做呢?谢谢
答案 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