我正在尝试使用和标签创建一个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) %>
所以我不明白为什么它不起作用, 有人可以帮助我吗?
谢谢!
答案 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
。