未定义的方法`每个'为零:NilClass:
<%@ users.each do | user | %GT;
我的应用中的管理员可以通过我创建的用户信息中心手动创建用户。但是,在单击按钮创建新用户后,会发生一些奇怪的事情。
首先,我看到了"undefined method 'each' for nil:NilClass"
,其中引用了Users Index View
(用户创建后管理员被重定向。如果我刷新页面,浏览器URL框仍然表明它&但是,在Users Index
页面上,屏幕会显示New User
页面,其中包含已声明输入的User Email
已被拍摄的情况。如果我手动转到User Index
}页面,然后我可以看到用户添加成功,我 NOT 显示undefined method
错误。真是太棒了!我知道我有一些乱码,但我不知道为什么会这样。
用户控制器摘录:
def index
@users = User.all
end
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.html { render :index, notice: 'user was successfully created.' }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
用户索引视图摘录:
<tbody>
<% @users.each do |user| %>
<tr>
<td><%= user.admin ? "<i style='color:green' class='glyphicon glyphicon-flash'><strong>Admin</strong></i>".html_safe : " " %></td>
<td><strong><%= link_to user.email,user %></strong></td>
<td><span class="badge"><%= user.sign_in_count %></span></td>
<td><%= user.activated ? "<i style='color:green' class='glyphicon glyphicon-ok'></i>".html_safe : "<i style='color:red' class='glyphicon glyphicon-remove'></i>".html_safe %></td>
<td><b>
<%= link_to user do %>
<span class="badge"><%= user.apps.count %></span> View
<% end %>
</b></td>
<td><%= link_to "<i class='glyphicon glyphicon-pencil'><strong> Manage</strong></i>".html_safe, edit_user_path(user), class: 'btn btn-primary btn-xs' %></td>
<td><%= link_to "<i class='glyphicon glyphicon-remove'></i> Destroy".html_safe, user, method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-danger btn-xs' %>
</td>
</tr>
<% end %>
</tbody>
路线文件摘录:
devise_for :users, :path_prefix => 'u'
resources :users
devise_scope :user do
get "login", to: "devise/sessions#new", as: :login
get 'logout', to: 'devise/sessions#destroy', as: :logout
get 'user/edit', to: 'devise/registrations#edit', as: :change_password
end
如果您有任何其他代码,请与我们联系。 您可以在GitHub上找到整个应用: https://github.com/nickdb93/QwesteraCONNECT/tree/completion
答案 0 :(得分:2)
我可能没有以最好的方式解决这个问题,但我找到了一个方便的解决方法。
我更改了if @user.save
中的UsersController#create
操作,如下所示。
respond_to do |format|
if @user.save
format.html { render :index, notice: 'user was successfully created.' }
更改为:
respond_to do |format|
if @user.save
format.html { redirect_to users_path, notice: 'user was successfully created.' }
如果您有更好的方法,请添加您的输入。我很想学习Rails这样做的方法。
答案 1 :(得分:2)
您的解决方案非常完美:
respond_to do |format|
if @user.save
format.html { redirect_to users_path, notice: 'user was successfully created.' }
这是因为您将渲染更改为redirect_to。 Render将使用它在该操作中有权访问的实例变量呈现视图。在您的原始问题中,您在#create操作中调用了render。这不起作用,因为#create操作无法访问@users实例变量。
redirect_to告诉浏览器重新请求新的网址。在您的工作解决方案中,您告诉浏览器请求转到#index操作的URL。然后,索引操作将设置@users实例变量并呈现:index
这些资源比我更好地解释了render和redirect_to之间的区别: Are redirect_to and render exchangeable?