0

我一直在尝试编辑默认脚手架,并且到目前为止非常成功。然而,这个小谜题让我感到困惑,因为即使将文件恢复到原始状态也不起作用。正如标题所暗示的那样,它为 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| %>

任何帮助,将不胜感激!

4

1 回答 1

0

在 when@current_user设置的情况下,您的new操作不会在redirect_to. 执行继续执行该respond_to块,该块尝试在设置的情况下呈现页面@user,从而导致您遇到错误。

可能的解决方案:

  1. 使用前过滤器—如果前过滤器触发重定向,则暂停当前操作的执行。这是标准的 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
    

引用:http ://excid3.com/blog/execution-after-redirect-vulnerability

于 2013-05-15T17:49:42.407 回答