场景是这样的: 我有2个模型 - 视图 - 控制器,A和B.
在A的index.html.erb中,我有一个指向B&#39的new.html.erb的链接,看起来像/ a / 1 / b / new。也可以通过执行/ b / new来显示B.
在B&B的新方法中有没有办法告诉我从那里到达那里?
如果来自A,我需要做,做一些,否则不要。
由于
答案 0 :(得分:2)
您可以使用参考
refer_hash = Rails.application.routes.recognize_path(request.referrer)
现在您可以通过
检查以前的控制器refer_hash[:controller]
和
的行动refer_hash[:action]
所以最后你会得到像
这样的代码refer_hash = Rails.application.routes.recognize_path(request.referrer)
if refer_hash[:action] == 'index' && refer_hash[:controller] == 'A'
# Do something
else
# Do something else
end
答案 1 :(得分:0)
如果您的操作正在使用A资源处理请求,您应该能够在params哈希中检索a_id。这是我经常在我的应用程序中使用的方法:
class BController < ApplicationController
def new
if params[:a_id].present?
#do something with A here
else
#do something otherwise
end
end
end
如果您想确定,请在控制台中运行rake routes
以查看请求的外观。我想你会看到这样的路线:
a/:a_id/b/new
和这样的另一条路线
/b/new
答案 2 :(得分:0)
<强> FYI 强>
如果您想知道控制器的名称和动作,您可以使用名为action_name
(now action
it seems)和controller_name
这是否会直接帮到你,我不确定
-
<强>推荐强>
在B的新方法中,有没有办法告诉我从那里到达那里?
我不知道这是否会解决您的问题以及@sonnyhe2002
的答案,但如果您从nested resource
请求B
,则可以使用params
哈希来实现您想要的功能
如果您的路线是这样的:
#config/routes.rb
resources :a do
resources :b #-> domain.com/a/:a_id/b/new
end
这意味着如果您将b#new
操作作为嵌套路线的一部分进行渲染,则可以使用变量params[:a_id]
,这意味着您将能够测试b
中是否存在#app/controllers/b_controller.rb
def new
if params[:a_id]
# logic
else
# logic
end
end
{1}}控制器操作:
{{1}}
这是另一种看待它的方式