2016-11-18 3 views
0

Я пытаюсь создать форму rails с помощью и тегом, но я хочу сгенерировать опции с помощью json-файла, потому что я хочу всех стран. Но у меня есть эта ошибка:Ruby on rails: undefined method 'map' для # <String>

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) %> 

Так что я не понимаю, почему это не работает, Помогает ли кто-нибудь мне?

Спасибо!

ответ

2

Я думаю, что file = File.read(File.join(Rails.root, 'app', 'helpers', 'countries.json')).to_json линия на самом деле не возвращает объект JSON, просто Строка. Вы пробовали распечатать countries? Это может быть связано с сообщением this.

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') 
+0

Я бы подробно остановился на этом. –

+0

@SergioTulentsev мой английский или что-нибудь еще? –

+0

Это лучше :) –

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.

+0

Я всегда удивляюсь, почему строка имеет метод 'to_json')) –

+0

@ Зелёный: так что рекурсивные сериализаторы могут работать, я думаю :) –

+0

@ Зелёный Причина такая же, как 'nil.to_json == 'null''. – mudasobwa

Смежные вопросы