Ruby on rails:#string>的未定义方法'map'

时间:2016-11-18 13:35:30

标签: ruby-on-rails json ruby forms

我正在尝试使用和标签创建一个rails表单,但我想用json文件生成选项,因为我想要所有的国家/地区。 但我有这个错误:

undefined method `map' for #<String:0x007f871472e9b0> 

这是我的application_helper.rb:

module ApplicationHelper
  def countries_for_select
    file = File.read(File.join(Rails.root, 'app', 'helpers', 'countries.json')).to_json
    countries = JSON.parse(file)
    countries.map {|c| [ c['country']['name'], v['country']['code'] ] }
  end
end

这是我的posts_controller.rb:

  def create
    countries_for_select
    @post = Post.new(posts_params)
    @post.user = current_user
    options_for_countries
    if @post.save
      flash[:success] = "Your post have been published"
      redirect_to post_show_path
    else
      render 'new'
    end
  end

以下是我的_form.html.erb文件中的行:

<%= select_tag(:country, countries_for_select) %>

所以我不明白为什么它不起作用, 有人可以帮助我吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

删除to_json

 File.read(File.join(Rails.root, 'app', 'helpers', 'countries.json')).to_json
                                                                     ^^^^^^^^^

小提示:

Rails.root有一个方法join

Rails.root.join('app', 'helpers', 'countries.json')

答案 1 :(得分:2)

我认为file = File.read(File.join(Rails.root, 'app', 'helpers', 'countries.json')).to_json行并不真正返回JSON对象,只是一个String。您是否尝试过打印countries? 它也可能与this发布有关。

答案 2 :(得分:2)

您不需要.to_json此处

file = File.read(File.join(Rails.root, 'app', 'helpers', 'countries.json')).to_json
countries = JSON.parse(file)

.to_json是jsonifying对象(从复杂对象生成json字符串)。

当它应用于字符串时,它会返回一个字符串,其中包含一个字符串

"{foo: 1}".to_json # => "\"{foo: 1}\""

File.read已经返回有效的json字符串(或者我们假设),稍后您可以JSON.parse。但是当你再次jsonify它时,它会变成另一个json对象:一个字符串(反过来,它包含一些json)。这就是导致错误的原因:字符串没有方法.map