【问题标题】:Is it valid to include view code in Model?在模型中包含视图代码是否有效?
【发布时间】:2012-04-09 05:11:14
【问题描述】:
各位,我是 RoR 和 MVC 的新手。
我有一个处理贷款受益人数据的模型。为了访问结构化数据(包括一小段 HTML 数据),我创建了一个类似这样的方法
class Beneficiary < ActiveRecord::Base
def info
"#{name}</br>#{age},#{sex}</br><b>Address :</b>#{address}"
end
end
在视图中,我正在使用类似这样的信息
<%= @b.info.html_safe %>
是,b 是 Beneficiary 类的一个实例
它对我来说很好用。我只想知道,我在这里违反了 MVC 规则吗?在模型中包含视图代码是否有效?
【问题讨论】:
标签:
ruby-on-rails
rails-activerecord
erb
【解决方案1】:
如果您想使用 HTML 标签显示数据,您可以编写辅助方法而不是写入模型。或者更多您想要重构或清理您的代码,您可以观看draper 或presenter
【解决方案2】:
最好把它放到一个帮助文件中。
# /app/helpers/beneficiary_helper.rb
module BeneficiaryHelper
def beneficiary_info(b)
"#{b.name}<br>#{b.age},#{b.sex}<br><b>Address:</b>#{b.address}"
end
end
在你看来,你可以简单地使用
<%= raw beneficiary_info(@b) %>
注意:我建议使用带有类属性和 CSS 的 <span> 元素来处理换行符和字体粗细,而不是 <br> 和 <b>
补充说明:如果您希望助手可用于整个应用程序,您可以将其放入/app/helpers/application_helper.rb
【解决方案3】:
我确定一个模型它不是放置 HTML 的地方,使用帮助器肯定是一种改进,但考虑使用部分的可能性:
# /views/beneficiaries/_beneficiary.html.erb
<%= beneficiary.name %><br />
<%= beneficiary.age %>,<%= beneficiary.sex %><br />
<b>Address :</b><%= beneficiary.address %>
然后在您需要显示受益人信息时在您的视图中呈现此部分:
<%= render @beneficiary %>
更新:如果您需要以不同方式显示受益人及其信息,您应该将受益人信息放入 /views/beneficiaries/_info.html.erb 然后以这种方式调用render:
render :partial => "beneficiaries/info", :locals => {beneficiary: @beneficiary}