"未定义的方法`每个'为零:NilClass"仅在创建新用户之后。奇怪的行为

时间:2015-06-23 19:51:53

标签: ruby-on-rails devise

  

未定义的方法`每个'为零: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

2 个答案:

答案 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?

Render and Redirect