未定义的方法`map'对于rails4中的字符串

时间:2014-06-14 11:59:54

标签: ruby-on-rails ruby-on-rails-4 link-to slim-lang

在我的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

2 个答案:

答案 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) }