Rails技术问询:如何为Event实例添加价格属性供视图调用?
问题分析与解决方案
首先,咱们来拆解下你当前代码的核心问题:你确实收集到了每个event对应的价格数组,但没有把这个数组和event对象绑定在一起,而且prices只是each循环块里的局部变量,循环结束后这个变量就被销毁了——说白了,你的event对象根本没有price(或者prices)这个属性,视图里自然调用不了。
修复方案一:临时给event对象添加属性(控制器内处理)
你可以在循环里把收集到的价格数组赋值给event的实例变量,甚至临时定义一个方法来方便调用:
@events.each do |event| # 用pluck替代手动each+push,写法更简洁高效 prices = event.tickets.pluck(:face_value) # 给event设置实例变量 event.instance_variable_set(:@prices, prices) # 临时定义一个prices方法,让视图可以直接调用 def event.prices @prices end end
之后在视图里就可以这样调用:
<%= @events.first.prices.first %>
(小提醒:你写的@event.first应该是笔误,应该是@events.first,因为@events是数组类型)
修复方案二:在模型中添加方法(更符合Rails MVC规范)
其实更推荐的做法是把这个逻辑放到Event模型里,这样控制器代码更简洁,也符合MVC的职责划分:
# app/models/event.rb def face_prices # 直接通过关联获取所有ticket的face_value,返回数组 tickets.pluck(:face_value) end
这样控制器里不需要额外的循环处理,视图里直接调用:
<%= @events.first.face_prices.first %>
为什么原来的代码不行?
你原来的代码里,prices是event.tickets.each块内的局部变量,当块执行完成后,这个变量就会被Ruby回收。而且你从来没有把这个数组赋值给event对象的任何属性,所以event根本不知道有这个数组的存在,视图自然无法通过event.price访问到它。
内容的提问来源于stack exchange,提问作者Sam Roberts
相关产品推荐
相关产品推荐

