我有一个项目,其中的实体或类称为研究性研究,其中包含字段title
和mobile 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
类本身或任何其他解决方案,但我不确定如何。
答案 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控制台中访问它。