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

Ruby on rails Rails控制器知道是哪个动作把我带到了这里,ruby-on-rails,Ruby On Rails,情况是这样的: 我有两个模型视图控制器,A和B 在A的index.html.erb中,我有一个指向B的new.html.erb的链接,看起来像/A/1/B/new。B也可以通过执行/B/新建来显示 在B的新方法中,有没有办法告诉我是从a到那里的 如果我来自A,我需要做一些,否则不要 谢谢您可以使用 refer_hash = Rails.application.routes.recognize_path(request.referrer) 现在,您可以通过以下方式检查以前的控制器: refer_

情况是这样的: 我有两个模型视图控制器,A和B

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

在B的新方法中,有没有办法告诉我是从a到那里的

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

谢谢

您可以使用

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

如果您的操作正在使用资源处理请求,则应该能够在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
还有一条像这样的路线

/b/new
FYI

如果您想知道控制器和操作的名称,可以使用两个名为和的Rails助手

我不确定这是否能直接帮助你

--

推荐

在B的新方法中,有没有办法告诉我是从a到那里的

我不知道这是否能解决您的问题以及
@sonnyhe2002
的答案,但如果您向a请求
B
,您可以使用
参数
散列来实现您想要的功能

如果您的路线是这样的:

a/:a_id/b/new
#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

这是另一种看待它的方式

我通过检查签入B控制器,params[:a_id]来解决它。如果导航为/a/1/b/则应存在新的a.id参数。似乎正确?这正是我的建议:)如果我的答案是正确的,你能把它标记为答案吗?:)从技术上讲,这并不能说明以前的控制器是什么。如果不小心将参数[:a_id]设置为a或B的形式,则无法区分它们。您也不应该依赖params来检查前面的内容,因为用户可以轻松地编辑表单html并添加一个_id