我一直在尝试编辑默认的脚手架,并且迄今为止都非常成功。然而,这个小小的谜题已经成功地让我感到困惑,因为即使将文件恢复到原始状态也无法正常工作。正如标题所示,它正在为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| %>
任何帮助将不胜感激!
答案 0 :(得分:0)
如果设置了@current_user
,则new
操作不会在redirect_to
之后停止执行。执行进行到respond_to
块,该块尝试在没有设置@user
的情况下呈现页面,从而导致您收到错误。
可能的解决方案:
使用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
早点回来。
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