在我正在处理的应用中,用户可以从几个不同的地方获取新表单。我需要将它们重定向到它们来自的地方。我通过在视图的链接中传递参数来解决它,例如
= 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"
任何建议?猜猜我试图让它重新定向并删除一行中的会话,这是我所不知道的......
答案 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缓存代理性能。