Rails Photo模型调用link_to报错:undefined method `link_to' for #<Photo
修复Rails模型中调用link_to报错的问题
问题原因
link_to是Rails视图层(ActionView)的专属辅助方法,模型(Model)层默认不会加载这些视图相关的方法,所以直接在Photo模型里调用会报「undefined method `link_to'」的错误。
修复方案
方案1:遵循MVC职责分离(推荐)
把生成链接的逻辑移到视图或者Helper里,这才是符合Rails MVC设计的做法:
- 直接在视图模板中编写:
<%= @photo.cars.map { |c| link_to(c.name, c) }.join(" AND ") %> - 或者在
app/helpers/photos_helper.rb中封装复用方法:
之后在视图里调用即可:def car_links(photo) photo.cars.map { |c| link_to(c.name, c) }.join(" AND ") end<%= car_links(@photo) %>
方案2:在模型内生成链接(不推荐,破坏职责边界)
如果业务需求必须在模型层实现,需要手动构建HTML链接并引入路由辅助方法:
# app/models/photo.rb include Rails.application.routes.url_helpers def car_links cars.map do |car| # 用ERB::Util.h转义内容,防范XSS攻击 "<a href='#{car_path(car)}'>#{ERB::Util.h(car.name)}</a>" end.join(" AND ") end
调用该方法时,要在视图中用raw()输出,避免HTML被转义:
<%= raw @photo.car_links %>
内容的提问来源于stack exchange,提问作者rctneil
相关产品推荐
相关产品推荐

