如何在Rails中实现PRG?
我在Rails中使用了PRG,但我并不完全相信它是对的。我想知道在Rails中有没有更好的方法来处理它?</ p>
答案 0 :(得分:5)
我不知道PRG模式有多受欢迎,为什么人们必须虔诚地坚持“重定向”它的失败方面(实际上,有一个很好的理由有时你不想处理“设置”的复杂性制造失败并保持干燥)。
你基本上需要的是将params:user转移到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
答案 1 :(得分:1)
使用会话,Luke
您在博客文章中实现它的方式非常好,但您可能希望使用session
代替flash
来存储@user
,并可选择使用 ActiveRecord会话商店,以防止cookie变得臃肿。
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
答案 2 :(得分:1)
我不是这些问题的专家,但这看起来不错。根据我的理解,flash是会话的一部分。因此,告诉您切换到会话的答案似乎有点误导。在这种情况下,您希望在重定向后清除数据。除了推迟会议,我不知道你会把它放在哪里。
就你的cookie大小增加而言,Rails的默认会话提供程序是Rails 3中的cookie。如果你想保留数据服务器端,你可以交换会话提供程序。它是加密的,所以你可能对cookie中的数据没问题,除非大小是个问题。
答案 3 :(得分:0)
使用下面的代码
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
答案 4 :(得分:0)
但是,你不应该做redirect_to '/'
。您应该在路径文件中定义root,然后执行redirect_to root_path
。
编辑:哎呀,这应该是对SpyrosP答案的评论。
另外:以下是一些卓越的指导on flash.特别是这可能会让您放心:
闪存是会话的一个特殊部分,每次请求都会清除它。这意味着存储在那里的值只能在下一个请求中使用,这对于存储错误消息等非常有用。
有趣的是,是的,它是会话的一部分,所以“使用会话而不是闪存”的答案是错误的,正如Justin Etheredge的回答已经提到的那样。另一件事是,它表示有用用于存储消息而不是仅用于存储消息。通过添加“等”,它会让我相信在用户信息存储的预期用途范围内。
最后一点,我同意Aditya Sanghi你应该只是存储用户参数而不是整个用户对象。
答案 5 :(得分:0)
我没有正确地阅读这个问题。
您需要进行验证失败,必须转到另一个不同进程的页面。您尝试更新域对象,它不存在。对验证失败的通常响应是重新呈现页面,但您需要转到创建页面。
flash哈希似乎错了。我同意将输入的数据填入会话并重定向的想法。