存储请求源自rails的位置的好方法

时间:2015-01-10 22:35:06

标签: ruby-on-rails ruby

如果我要从不同的地方创建一些对象,例如:

  1. 我正在从我的索引页面创建对象(PO​​ST到创建控制器的方法)
  2. 我正在从我的节目页面创建对象(PO​​ST来创建控制器的方法)
  3. 如果成功/错误,我希望能够返回请求者页面并显示flash消息。

    到目前为止,我得到了这个工作:

    def store_location
        session[:return_to] = request.url
      end
    
    def redirect_back_or(default)
        redirect_to(session[:return_to] || default)
        session.delete(:return_to)
      end
    

    但我担心的是,如果我的团队中的其他人选择使用这段代码来解决类似问题。它可能会导致应用程序重定向到完全不同的位置。

    有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

其中一个可能的解决方案是在表单中添加一个hidden_​​field,以便区分这两种情况。

我们假设你有Post模型,请考虑一个例子:

从显示页面:

<%= form_for @post  do |f| %>
   ...
   <%= hidden_field_tag :return_to, posts_path %>
<% end %>

第二种形式(即在索引页面上)可以保持不变,因此它不会传递任何值为&#34; return_to&#34;参数。如果没有值传递给&#34; return_to&#34;我们会检查一个控制器。然后将其视为&#34;从索引页面提交&#34;情况下。

在您的控制器中:

def create
   ...
   redirect_to params[:return_to] || posts_path
end

答案 1 :(得分:1)

或者如何使用实际的请求引荐来源?

控制器:

 def create
   ...some create logic
   flash[:success] = 'YEEEY
   redirect_to request.referer
 rescue
   flash[:error] = 'ERROR OCCURRED'
   redirect_to request.referer
 end