假设我有这样的事情:
def new
@user = User.new
end
def create
@user = User.create(params[:user])
if @user.save
flash[:notice] = 'User created'
redirect_to :action => 'list'
else
flash[:error] = 'Some error here!'
render 'new'
end
end
我认为代码很清楚
这里的问题是,当@user
对象未成功保存时,我应该呈现new
(如上所述)还是应该重定向到new
?
我知道如果重定向到new
用户输入的数据会丢失,但如果我呈现new
,则网址将为/users/create
而不是/users/new
(其中太丑了!)。
答案 0 :(得分:2)
你没有使用redirect
是正确的。重定向正在加载一个全新的资源。
render
会保持会话数据的新鲜度,并且根据表单的设置方式,应重新填充输入的数据。
你提到:
我知道如果重定向到新用户输入的数据会丢失,但如果我渲染新的,则URL将是/ users / create而不是/ users / new(这很丑!)。
不,这不是真的。如果您说render 'new'
,则会转到您未创建的网址users/new
。创建为操作仅处理对您的控制器的POST
请求,并且通常永远不会有与之关联的视图。它将引用new
操作来处理任何错误并显示表单。
创建操作与update
操作有此共同点,该操作通过仅处理PUT
请求执行相同操作,但引用edit
操作来处理视图的显示。