0

我的newedit页面依赖于一个@important_data未在createupdate操作中使用的实例变量。

结果,我的new页面在失败时无法呈现页面。

def create
  @my_object = MyObject.new(params[:my_object])
  if @my_object.save
    redirect_to root_path
  else
    render action: "new"
    #this can't render because the page asks for an @important_data variable that's not defined.
  end
end 

我应该选择以下两种解决方案中的哪一种?每个的优点/缺点是什么?

选项 1:在渲染之前声明 @important_data

def create
  @my_object = MyObject.new(params[:my_object])
  if @my_object.save
    redirect_to root_path
  else
    @important_data = ImportantData.all
    render action: "new"
  end
end 

选项 2:重定向

def create
  @my_object = MyObject.new(params[:my_object])
  if @my_object.save
    redirect_to root_path
  else
    redirect_to new_my_object_path
  end
end 
4

3 回答 3

1

我认为你应该使用OPTION1

所以应该使用redirect_to的地方是当你做一个HTTP POST请求并且你不希望用户在完成后重新提交请求(这可能会导致重复的项目和其他问题)。

在 Rails 中,当模型保存失败时,render 用于重新显示表单,其中包含之前填写的相同条目。这更简单,因为如果您使用重定向,则必须使用参数或会话传递表单条目。副作用是,如果您刷新浏览器,它将尝试重新提交之前的表单条目。这是可以接受的,因为它可能会以同样的方式失败,或者如果它现在成功了,那么无论如何这都是用户首先应该期望的。

以上答案引用自:redirect_to 和render 是否可交换?

于 2013-09-01T04:26:16.097 回答
1

当然,Option1 效果最好,因为您只是在出现错误的情况下渲染新的。此外,重定向会有点混乱用户体验,使用相同的查询 @important_data = .... 再次运行再次呈现页面需要一点时间。

于 2013-09-01T04:15:36.677 回答
1

当您使用 时render,您使用@my_object的是从 更新的属性params[:my_object]。大多数情况下,这就是你想要的。当您向用户显示页面时,您希望保留他们对表单所做的更改并向他们显示错误。

当您使用 时redirect,您正在执行不同的附加请求,因此不会保留从表单提交的参数(除非您在调用中传递它们以重定向并在控制器操作中构建它们)。

因此,在大多数情况下,您肯定希望@important_data在验证失败时声明。我想不出你想要重定向的情况。

于 2013-09-01T04:19:14.753 回答