Rails控制器知道哪个动作把我带到了这里

时间:2014-06-15 03:21:44

标签: ruby-on-rails

场景是这样的: 我有2个模型 - 视图 - 控制器,A和B.

在A的index.html.erb中,我有一个指向B&#39的new.html.erb的链接,看起来像/ a / 1 / b / new。也可以通过执行/ b / new来显示B.

在B&B的新方法中有没有办法告诉我从那里到达那里?

如果来自A,我需要做,做一些,否则不要。

由于

3 个答案:

答案 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

的两个Rails助手

这是否会直接帮到你,我不确定

-

<强>推荐

  

在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}}

这是另一种看待它的方式