Rails在Controller中建模方法可用性

时间:2011-12-06 13:56:54

标签: ruby-on-rails

我的模型中有一个方法可以检测用户代理。如何使其可用于我的所有控制器方法?

型号:

  def is_iphone_request?
       if request.user_agent =~ /iPhone/
       return true
     end
  end

控制器(抛出错误):

def index
  @user_agent = is_iphone_request?
end

我怎样才能做到这一点?非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

将方法放在ApplicationController而不是模型中。

答案 1 :(得分:0)

我不确定你为什么要对模型进行请求用户代理检查 - 这似乎是一种以控制器为中心的行为。并且您可以使用控制器中的请求属性。

答案 2 :(得分:0)

虽然request 在模型中可用(您将获得带有以下代码的NameError),但您当前的问题是控制器正在抛出{ {1}}因为您在方法定义中缺少NoMethodError。使它成为一个类方法(通过添加self.):

self.

然后,在您的控制器中,您可以使用:

class MyModel < ActiveRecord::Base
  def self.is_iphone_request?
   if request.user_agent =~ /iPhone/
     return true
   end
end

但就像我说的那样,你会得到MyModel.is_iphone_request? ,因为模型中没有NameError

您的方法request应该存在于您的is_iphone_request?中(可以是常规的ApplicationController方法)。你也可以减少它:

private

然后,在您的控制器中,您可以使用:

class ApplicationController < ActionController::Base
  ...
  private
  def is_iphone_request?
    request.user_agent =~ /iPhone/ ? true : false
  end
end