用于NilClass的未定义方法`model_name':Class,new action

时间:2013-05-15 13:17:17

标签: ruby-on-rails ruby

我一直在尝试编辑默认的脚手架,并且迄今为止都非常成功。然而,这个小小的谜题已经成功地让我感到困惑,因为即使将文件恢复到原始状态也无法正常工作。正如标题所示,它正在为NilClass:Class抛出一个“未定义的方法`model_name'。”

用户控制器中的新操作:

def new
  if @current_user
    redirect_to(action: 'home')
  else
    @user = User.new
  end

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @user }
  end
end

_form.html.erb开头

<%= form_for(@user) do |f| %>
  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from    being saved:</h2>

      <ul>
        <% @user.errors.full_messages.each do |msg| %>

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

如果设置了@current_user,则new操作不会在redirect_to之后停止执行。执行进行到respond_to块,该块尝试在没有设置@user的情况下呈现页面,从而导致您收到错误。

可能的解决方案:

  1. 使用before过滤器 - 如果before过滤器触发重定向,则暂停执行当前操作。这是标准的Rails实践。

    before_filter :check_for_current_user, only: [:new]
    
    def new
      @user = User.new
    
      respond_to do |format|
        format.html # new.html.erb
        format.json { render json: @user }
      end
    end
    
    protected
    
    def check_for_current_user
      redirect_to(action: 'home') if @current_user
    end
    
  2. 早点回来。

    def new
      if @current_user
        redirect_to(action: 'home') and return
      end
    
      @user = User.new
    
      respond_to do |format|
        format.html # new.html.erb
        format.json { render json: @user }
      end
    end
    
  3. 引用:http://excid3.com/blog/execution-after-redirect-vulnerability