使用多个ifs重构rails重定向

时间:2015-02-23 15:00:59

标签: ruby-on-rails ruby

在我正在处理的应用中,用户可以从几个不同的地方获取新表单。我需要将它们重定向到它们来自的地方。我通过在视图的链接中传递参数来解决它,例如

= link_to "create a new post »", new_user_post_path(@current_user, :return_to => 'dashboard')

然后在控制器中的新动作中如此

if params[:return_to] == 'dashboard'
  session[:return_to]= 'dashboard'
end

现在我正在看控制器。我需要做的事情我可以通过非常冗长来实现,但我正在寻找更优雅的解决方案。这就是我现在所拥有的

if @user_post.save
  flash[:notice] = "New Post Created"
  if session[:return_to] == 'dashboard'
    session.delete(:return_to)
    redirect_to dashboard_path and return
  else
  redirect_to user_hub_path(@user)
 end
else
  flash[:error] = "Could not save post"
  redirect_to new_user_post_path(@user)
end

这就是我需要的,但我希望能够整理一下。我开始关注1行调查员,看看我是否可以做这样的事情......

if @user_post.save
  flash[:notice] = "New post Created"
  session[:return_to] == 'dashboard' ? redirect_to "#{session.delete(:return_to)}_path" : redirect_to user_hub_path(@user)
else
  flash[:error] = "Could not save post"
  redirect_to new_user_post_path(@user)
end

但它真的不喜欢这部分...... redirect_to"#{session.delete(:return_to)} _ path"

任何建议?猜猜我试图让它重新定向并删除一行中的会话,这是我所不知道的......

3 个答案:

答案 0 :(得分:1)

这看起来是使用Rails的内置:back参数的好例子,根据Rails文档here,该参数将用户“返回到发出请求的页面。对于从多个地方触发的表单。对redirect_to(request.env [“HTTP_REFERER”])“

的简写

您可以避免传递return_to参数,并将控制器代码更改为:

if @user_post.save
  redirect_to :back, notice: "New Post Created" and return
else
  redirect_to new_user_post_path(@user), flash: { error: "Could not save post" }
end

答案 1 :(得分:0)

如何使用send

send获取消息名称和可选参数,然后转发给发送者的接收者(http://ruby-doc.org/core-2.2.0/Object.html#method-i-send

path = send("#{session.delete(:return_to)}_path")
redirect_to path

在这种情况下,它将消息发送到当前控制器实例(与调用..._path方法相同,但提供动态调用的灵活性)

答案 2 :(得分:0)

请使用Referer标头,而不是使用控制器的redirect_to变量。

  

HTTP referer(最初是引用者拼写错误)是一个HTTP头字段,用于标识链接到所请求资源的网页地址(即URI或IRI)

在Rails中,控制器内部非常简单

redirect_to request.referer

这更优雅高效,因为会话cookie存储可能很昂贵(缓存存储)并且可能会影响您的HTTP缓存代理性能。