他们是两个用户:
用户登录用户
访客 - 未登录访客。
用户和访客可以发帖提问。要发布问题,访客必须指定他的电子邮件。
他们是两个视图“new.html.erb”和“new_for_guest.html.erb”。第一个依赖于@user变量。第二个不是。
如果由来宾创建的问题未通过验证,则应呈现“new_for_guest.html.erb”,保留所有输入的数据。
代码如下:
def new
@question = Question.new
guest = session[user_id].nil?
respond_to do |format|
if guest
format.html { render "new_for_guest" }
else
format.html { render "new" }
end
end
end
def create
@question = Question.new(params[:question])
guest = session[user_id].nil?
respond_to do |format|
if @question.save
flash[:notice] = 'Question was successfully created.'
format.html { redirect_to(@question) }
else
if guest
format.html { render :action => "new_for_guest" } # problem
else
format.html { render :action => "new" }
end
end
end
当访客验证失败并呈现“new_for_guest”视图时,我在浏览器中看到网址“/ questions”,而不是“/ questions / new”。因此,用于“新”动作的所有样式表都消失了。
当用户验证失败并呈现“新”视图时,我会看到正确的网址“/ questions / new”,一切正常。
当我说的时候
format.html{ redirect_to new_question }
将呈现“新”操作,但用户输入的所有数据都已消失。
我需要在“questions / new”上下文中呈现“new_for_guest”视图。
怎么做?
更新
我注意到了由脚手架生成的未触及代码的相同行为。
如果通过创建验证失败,则会再次呈现新操作,但在URL中,会显示“/ questions”而不是“/ questions / new”。
这很奇怪。这是正确的行为吗?
我找到了类似的未回答的问题Rails create action is redirecting to index when it should be rendering the new action
答案 0 :(得分:2)
这是正确的行为。根据RESTful路由,当一个表单为对象POST时,它将被发送到/object
URI,这意味着创建了一个具有未知ID的新对象。这在Rails Guides中有所描述。因此,当验证失败并且您只是呈现新操作时,您将使用该URI而不是/object/new
URI。
此外,你不应该对每个动作都特定你的风格,因为那里肯定会有不必要的代码冗余(我甚至不确定你是如何做到这一点的,当它在URI时不起作用变化)。对于一个动作有多个视图也是如此,它很少是绝对必要的,并且它看起来不是你的情况,因为当它是一个客人时你可以简单地利用一个空的@user
对象。