在我的Rails应用中,我尝试在events#index
视图中获取标记为指定标记的事件链接。为了使它们与link_to
相关联,我收到了以下错误:
undefined method `map' for "fgssgf,sfgdsfg,dsgfsdgf,sgfdsg":String` error
app/views/events/index.html.slim:17:in `block in _app_views_events_index_html_slim__...'
以下是与此问题相关的文件:
index.html.slim
:
table.table.table-bordered
thead
tr
th Title
th Start date
th End date
th Location
th Tags
tbody
- @events.each do |event|
tr
td = link_to event.title, event
td = event.start_date
td = event.end_date
td = event.location
td = event.all_tags.map { |t| link_to t, tag_path(t) }.join(', ') # line 17 here
index
中的 events_controller.rb
方法:
def index
if params[:tag]
@events = Event.tagged_with(params[:tag])
else
@events = Event.all
end
end
all_tags
& tagged_with
中的event.rb
方法:
def all_tags
tags.map(&:name).join(",")
end
def all_tags=(names)
self.tags = names.split(',').map do |t|
Tag.where(name: t.strip).first_or_create!
end
end
def self.tagged_with(name)
Tag.find_by!(name: name).events
end
答案 0 :(得分:2)
除Arup的丰富答案外;我在下面做了这些改动:
来自all_tags
的 event.rb
:
def all_tags
tags.map(&:name).join(',') # return stays same
end
从index.html.slim
链接部分:
td
- event.all_tags.split(',').map do |t| # single-line could be done but this one is better
= link_to t, tag_path(t)
答案 1 :(得分:1)
以下方法
def all_tags
tags.map(&:name).join(",") # here you are creating an string.
end
应该是
def all_tags
tags.map(&:name)
end
我上面说的创建字符串的方法,您尝试在其上调用Array#map
方法。哪个当然不可能。因此,您需要更改方法,以便返回 collection 而不是 string 。或者,如果您不想更改方法,则将字符串拆分回数组,以便您可以按以下方式调用#map
event.all_tags.split(",").map { |t| link_to t, tag_path(t) }