Post Redirect在Rails中获取模式

时间:2011-05-03 06:29:21

标签: ruby-on-rails ruby

如何在Rails中实现PRG?

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

6 个答案:

答案 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变得臃肿。

来自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

答案 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哈希似乎错了。我同意将输入的数据填入会话并重定向的想法。