Post Redirect在Rails中获取模式

如何在Rails中实现PRG?

我在Rails中使用了PRG,但我并不完全相信它是正确的。 我想知道在Rails中有没有更好的方法来处理它?

我不知道PRG模式有多受欢迎,为什么人们必须虔诚地坚持“重定向”它的失败方面(实际上,有一个很好的理由是有时候你不想处理创建失败时的“设置”复杂性和保持干燥)。

你基本上需要的是将params转换为:user to new。 我认为@ Hitesh的解决方案非常接近。

class UsersController < ApplicationController def new if flash[:user_params] @user = User.new(flash[:user_params]) @user.valid? else @user = User.new end end def create @user = User.new(params[:user]) if @user.save # clears previously stored user if there is any flash[:notice] = "User created." redirect_to '/' else flash[:error] = "Error saving User" flash[:user_params] = params[:user] redirect_to :action => :new end end end 

我不是这些问题的专家,但这看起来不错。 据我所知,flash是会话的一部分。 因此,告诉您切换到会话的答案似乎有点误导。 在这种情况下,您希望在重定向后清除数据。 除了推迟会议,我不知道你会把它放在哪里。

就你的cookie大小增加而言,Rails的默认会话提供程序是Rails 3中的cookie。如果你想保留数据服务器端,你可以交换会话提供程序。 虽然它是加密的,所以你可能对cookie中的数据没问题,除非大小是个问题。

使用下面的代码

 class UsersController < ApplicationController def new @user = User.new(session[:user_param]) session[:user_param]=nil end def create @user = User.new(params[:user]) if @user.save # clears previously stored user if there is any flash.discard(:user) redirect_to '/' else session[:user_param] = @user redirect_to :action => :new end end end 

使用会议,卢克

您在博客文章中实现它的方式非常好,但您可能希望使用session而不是flash来存储@user并可选择使用ActiveRecord会话存储来防止cookie变得臃肿。

来自ActionController :: Base文档

ActiveRecord :: SessionStore – 会话存储在您的数据库中,它比具有多个应用服务器的PStore更好,并且与CookieStore不同,它会隐藏用户的会话内容。 要使用ActiveRecord :: SessionStore ,请设置

 config.action_controller.session_store = :active_record_store 

在你的config/environment.rb运行rake db:sessions:create

所以你应该……

 class UsersController < ApplicationController def new @user = session[:user] || User.new end def create @user = User.new(params[:user]) if @user.save # clears previously stored user if there is any session[:user] = nil redirect_to '/' else session[:user] = @user redirect_to :action => :new end end end 

但是,你不应该做redirect_to '/' 。 您应该在routes文件中定义root,然后执行redirect_to root_path

编辑:哎呀,这应该是对SpyrosP答案的评论。

另外:这是关于闪存的一些卓越指导。 特别是这可以让你放心:

闪存是会话的一个特殊部分,每次请求都会清除闪存。 这意味着存储在那里的值只能在下一个请求中使用,这对于存储错误消息等很有用。

有趣的事情是,是的,它是会话的一部分,所以“使用会话而不是闪存”的答案是错误的,因为Justin Etheredge的答案已经说明了。 另一件事是它说它对于存储消息很有用 ,而不仅仅用于存储消息。 通过添加“等”,它将使我相信它也在用于存储用户信息的预期用途内。

最后一点,我同意Aditya Sanghi你应该只存储用户参数而不是整个用户对象。

我没有正确地阅读这个问题。

您需要进行validation失败,必须转到另一个将发生不同进程的页面。 您尝试更新域对象,它不存在。 对validation失败的通常响应是重新呈现页面,但您需要转到创建页面。

闪存哈希似乎错了。 我同意将输入的数据填充到会话中并重定向的想法。