如何在Rails中的所有方法中更改对象的值?

时间:2016-03-09 07:37:45

标签: ruby-on-rails ruby

我有一个项目,其中的实体或类称为研究性研究,其中包含字段titlemobile title。现在我使用gem来检测访问者的设备(桌面,移动设备等)。现在,我想要的是桌面应该总是返回“标题”,对于所有其他设备,它应该返回“移动标题”。

我怎样才能实现这一目标,这样我无论在哪里返回研究课程,都不需要在我的应用程序中更改所有方法?有没有解决办法,如果我在一个地方改变它,它应该反映在所有方法中?

编辑:由于这有大量的downvotes,我想清理我需要的东西。这是我的班级:

        class ResearchStudy < ActiveRecord::Base
         attr_accessible \
          :title,
          :mobile_title
           ....
         end

这是我的控制器,其中方法是获取所有研究,并使用过滤器获取类似的设备类型:

class Api::ResearchStudiesController < ApplicationController

    before_filter :check_agent

    def check_agent
        @ua = AgentOrange::UserAgent.new(request.user_agent)
    end


 def get_all_studies
    .....
  answer_status_for_user() // before returning studies i modify the title according to device type
     render json: { studies: @studies.to_json(:include => [:research_paper]) }
 end

def answer_status_for_user
if @ua.is_mobile?
            @studies.each do |study|
                study.title = study.mobile_title
            end
        end
end

现在问题在于get_all_studies我在应用程序中有各种方法,因为它是非常大的应用程序,因此有时候研究不像上面那样回应(@studies)。我想要的是像我们加载研究时想要应用一些更改(可能是构造函数或其他东西)而返回mobile_title而不是title,类似于ResearchStudy类本身或任何其他解决方案,但我不确定如何。

1 个答案:

答案 0 :(得分:1)

您可以在模型中覆盖此案例的属性读取器。

class YourModel < ActiveRecord::Base
  def title
    if device_is_mobile?
      "Title for Mobile"
    else
      "Default title"
    end
  end
end

your_object = YourModel.last
your_object.title # it will give you title depending upon which device being used.

由于您要为您的模型修改默认阅读器,因此可以在整个Web应用程序以及Rails控制台中访问它。