Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Разбор YAML 
:(
    Опции темы
aktuba
  Дата 6.6.2012, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Доброго времени суток. Изучаю ruby и уперся в какую-то не понятную, для меня, проблему. Не могу разобрать yaml-файл. Содержимое такое:

Код

# encoding: utf-8

user:
  :path: '<action>'
  :controller: 'user'
  :action: '(login|logout|register|restore)'

default:
  :path: '(<controller>(/<action>))'
  :controller: 'main'
  :action: 'index'


Подскажите, люди добрые, как из этого получить массив? yaml.to_a не работает, говорит "undefined method `bytesize' for #<Array:0x000000058cbdd8> file: utils.rb location: bytesize line: 281" ((


--------------------
user posted image
PM MAIL WWW Skype   Вверх
source777
Дата 6.6.2012, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 6
Всего: 56



Массив какого вида? Так то приведённые данные из yaml конвертируются явно в хэш, а не в массив.


Код

require 'yaml'
hash = YAML.load(yaml_str)
 => {"user"=>{:path=>"<action>", :controller=>"user", :action=>"(login|logout|register|restore)"}, "default"=>{:path=>"(<controller>(/<action>))", :controller=>"main", :action=>"index"}} 



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
aktuba
Дата 6.6.2012, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Код

["user", {:path=>"", :controller=>"user", :action=>"(login|logout|register|restore)"}]["default", {:path=>"((/))", :controller=>"main", :action=>"index"}]


Вот такого вида получаю данные. Задача - перебрать конфиг и найти подходящий роут и это не получается (


--------------------
user posted image
PM MAIL WWW Skype   Вверх
source777
Дата 6.6.2012, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 6
Всего: 56



Такого вида получатся после hash.to_a, хотя с хэшем привычнее...
Непонятно, что из себя представляет "перебрать конфиг и найти подходящий роут". Какие варианты входных данных?


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
aktuba
Дата 6.6.2012, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Цитата(source777 @ 6.6.2012,  14:47)
Такого вида получатся после hash.to_a, хотя с хэшем привычнее...
Непонятно, что из себя представляет "перебрать конфиг и найти подходящий роут". Какие варианты входных данных?

В том-то и проблема, что to_a нету. Вот код:

Код

# encoding: utf-8

class Request

  def execute()
    routes = YAML.load_file APPPATH + 'configs/routes.yml'
    unless routes.kind_of?(Hash)
      raise(InvalidConfig,"DeploYML file #{path.dump} does not contain a Hash",caller)
    end

    routes
  end

end


Входные параметры в первом посте (.yml файл). Что хочется: взять возможные роуты из yml-файла, перебором найти подходящий под текущий запрос и вызвать нужный контроллер и action.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
source777
Дата 6.6.2012, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 6
Всего: 56



Цитата(aktuba @  6.6.2012,  14:02 Найти цитируемый пост)
Входные параметры в первом посте (.yml файл).

Не, я имел в виду входные параметры для поиск по роутам. 

Цитата(aktuba @  6.6.2012,  14:02 Найти цитируемый пост)
В том-то и проблема, что to_a нету.

Ну а как тогда? Может это конечно как-то от версий зависит, но скопировав в файл данные из первого поста у меня получается только так:

Код

1.9.3-p194 :001 > YAML.load_file('routes.yml')
 => {"user"=>{:path=>"<action>", :controller=>"user", :action=>"(login|logout|register|restore)"}, "default"=>{:path=>"(<controller>(/<action>))", :controller=>"main", :action=>"index"}} 
1.9.3-p194 :002 > YAML::VERSION
 => "1.3.2" 


Впрочем, для перебора то какая разница, что хэш, что массив массивов.. всё едино:
Код

1.9.3-p194 :003 > hash = {"user"=>{:path=>"<action>", :controller=>"user", :action=>"(login|logout|register|restore)"}, "default"=>{:path=>"(<controller>(/<action>))", :controller=>"main", :action=>"index"}} 
 => {"user"=>{:path=>"<action>", :controller=>"user", :action=>"(login|logout|register|restore)"}, "default"=>{:path=>"(<controller>(/<action>))", :controller=>"main", :action=>"index"}} 
1.9.3-p194 :004 > arr = hash.to_a
 => [["user", {:path=>"<action>", :controller=>"user", :action=>"(login|logout|register|restore)"}], ["default", {:path=>"(<controller>(/<action>))", :controller=>"main", :action=>"index"}]] 
1.9.3-p194 :005 > arr.find{|k, v| v[:action]=~/login/}.first
 => "user" 



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
aktuba
Дата 6.6.2012, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Цитата(source777 @  6.6.2012,  15:33 Найти цитируемый пост)
Не, я имел в виду входные параметры для поиск по роутам. 


Пока никаких. По сути - request.path_info 

Цитата(source777 @  6.6.2012,  15:33 Найти цитируемый пост)
Ну а как тогда?


Код выше, ничего другого нет. Версии ruby и yaml такие же, как у тебя. Возможно дело в sinatra.

Цитата(source777 @  6.6.2012,  15:33 Найти цитируемый пост)
Впрочем, для перебора то какая разница, что хэш, что массив массивов.. всё едино:


Так говорю-же, to_a не работает ("undefined method `bytesize' for #<Array:0x000000058cbdd8> file: utils.rb location: bytesize line: 281"), а перебор по Symbol не подходит, так как планируется нечто подобное:

Код

# encoding: utf-8
default:
  :path: '(<controller>(/<action>(/<id>)))'
  :controller: 'main'
  :action: 'index'
  :id: '\d+'


Т.е., заранее не известны параметры роута.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
aktuba
Дата 6.6.2012, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Цитата(source777 @  6.6.2012,  15:33 Найти цитируемый пост)
Ну а как тогда?


routes.inspect выдает тоже самое, как у тебя. Я до этого смотрел через p routes (


--------------------
user posted image
PM MAIL WWW Skype   Вверх
aktuba
Дата 6.6.2012, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Видимо я чего-то не понимаю в ruby или yaml... Переписал код в такой вид:

Код

# encoding: utf-8

class Request

  def execute()
    filename = APPPATH + 'configs/routes.yml'
    config = YAML.load_file filename
    unless config.kind_of?(Hash)
      raise(InvalidConfig, "YAML not valid: #{filename}")
    end

    config.keys.each do |name|
      puts config[name]['action']
    end
  end

end


Вот yaml-файл:

Код

# encoding: utf-8
user:
  :path: '<action>'
  :controller: 'user'
  :action: '(login|logout|register|restore)'
default:
  :path: '(<controller>(/<action>))'
  :controller: 'main'
  :action: 'index'


На выходе ожидаю получить action в каждом роуте (т.е., '(login|logout|register|restore)index' ). Но, почему-то, на выходе получаю названия роутов, т.е. 'userdefault'. Что не так делаю? o_O


--------------------
user posted image
PM MAIL WWW Skype   Вверх
source777
Дата 6.6.2012, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 6
Всего: 56



Цитата(aktuba @  6.6.2012,  16:51 Найти цитируемый пост)
Но, почему-то, на выходе получаю названия роутов, т.е. 'userdefault'. Что не так делаю?

Это ты не из puts получаешь, это блок each возвращает перебираемый массив, это т.н. fluent interface.
А puts очевидно выводит тебе две пустых строки, т.к. ключа 'action' не существует.
Вот :action есть, ты ж сам во входном файле символы используешь вместо строк:
Код

config.keys.each do |name|
  puts config[name][:action]
end


Ну и в целом такой способ перебора кривоват, правильнее так:
Код

config.each do |name, options|
  puts options[:action]
end



Цитата(aktuba @  6.6.2012,  14:55 Найти цитируемый пост)
Возможно дело в sinatra.

У sinatra есть своя система роутинга, зачем писать велосипед?


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
aktuba
Дата 6.6.2012, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Цитата(source777 @  6.6.2012,  23:25 Найти цитируемый пост)
Это ты не из puts получаешь, это блок each возвращает перебираемый массив, это т.н. fluent interface.
А puts очевидно выводит тебе две пустых строки, т.к. ключа 'action' не существует.


Не, это я экспериментировал с routes.yml. В любом случае, проблема не в этом, см. дальше.


Цитата(source777 @  6.6.2012,  23:25 Найти цитируемый пост)

Код

config.keys.each do |name|
  puts config[name][:action]
end



Выдает "userdefault"


Цитата(source777 @  6.6.2012,  23:25 Найти цитируемый пост)

Код

config.each do |name, options|
  puts options[:action]
end



Выдает:
Код

["user", {:path=>"<action>", :controller=>"user", :action=>"(login|logout|register|restore)"}]["default", {:path=>"(<controller>(/<action>))", :controller=>"main", :action=>"index"}]


Последний вариант сейчас виден на getnotify.ru. Дополнительно приложил все файлы, может в них что не так (

Цитата(source777 @  6.6.2012,  23:25 Найти цитируемый пост)
У sinatra есть своя система роутинга, зачем писать велосипед? 


Потому что в синатре пипец какой не удобный роутинг (((. Для меня. Язык на полном ооп, а роуты на def (то бишь, фактически на функциях).

P.S.: а еще мне в php, в kohana, нравятся роуты за такие конструкции:

Код

Route::set('default', '(<controller>(/<action>(/<id>)))', array('id' => '\d+'))
    ->defaults(array(
        'controller' => 'main',
        'action'     => 'index',
    ));


Один-два роута и хватает на все приложение. В синатре так невозможно ((

Это сообщение отредактировал(а) aktuba - 6.6.2012, 22:41

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  ruby.rar 3,37 Kb


--------------------
user posted image
PM MAIL WWW Skype   Вверх
source777
Дата 6.6.2012, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 6
Всего: 56



Так ты результат в браузере что-ли смотришь!? puts ведь туда в принципе ничего не выводит, puts выводит только в консоль!
Браузер показывает тебе то, что возвращает метод execute.
Замени перебор хэша на это:
Код

config.map do |name, options|
  options[:action]
end.join('; ')

И будет тебе и в браузере видно.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
source777
Дата 7.6.2012, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 6
Всего: 56



Цитата(aktuba @  6.6.2012,  22:38 Найти цитируемый пост)
Один-два роута и хватает на все приложение. В синатре так невозможно ((

Насчёт невозможно - это ты конечно загнул.  smile 
По сути это самый примитивный MVC-роутинг. Другой вопрос, что для MVC логичнее Rails использовать.. 
Область применения Sinatra в основном там, где MVC крайне нежелателен. Если уж очень хочется именно на Sinatra, то начни хотя бы с Padrino.

Это сообщение отредактировал(а) source777 - 7.6.2012, 00:11


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
aktuba
Дата 7.6.2012, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Цитата(source777 @  7.6.2012,  00:55 Найти цитируемый пост)
Так ты результат в браузере что-ли смотришь!? puts ведь туда в принципе ничего не выводит, puts выводит только в консоль!


Блин, не знал про это. Thx.


Цитата(source777 @  7.6.2012,  00:55 Найти цитируемый пост)

Код

config.map do |name, options|
  options[:action]
end.join('; ')



Помогло! Спс огромное, завтра буду дальше разбираться. Вернул веру в руби )))

Цитата(source777 @  7.6.2012,  01:11 Найти цитируемый пост)
Насчёт невозможно - это ты конечно загнул.   


Ну может совсем немного... Но в целом сказал как есть ;)

Цитата(source777 @  7.6.2012,  01:11 Найти цитируемый пост)
Другой вопрос, что для MVC логичнее Rails использовать.. 


Не поверишь - не хочу. Почитал про rails, посмотрел примеры, бенчмарки. Не хочу юзать рельсы )

Цитата(source777 @  7.6.2012,  01:11 Найти цитируемый пост)
Область применения Sinatra в основном там, где MVC крайне нежелателен. Если уж очень хочется именно на Sinatra, то начни хотя бы с Padrino.


Я когда-то кохану выбрал именно по той причине, что дает только основу и огромные возможности. С синатрой так же, по сути. А вот padrino не получилось заюзать. Уже не помню почему, но не работало у меня (( Да и наворочено лишнего. Например, я очень не люблю кодогенераторы. До сих пор не понимаю смысла миграций. В padrino отсутствует поддержка mysql2, насколько я помню, а orm/active record я обхожу стороной (правда, это из-за php, но не думаю что в руби с этим лучше будет). Ну и роуты в padrino тоже не блещут удобством ))

P.S.: мечта - найти ko3 на руби. Пока не нашел (((


--------------------
user posted image
PM MAIL WWW Skype   Вверх
source777
Дата 7.6.2012, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 6
Всего: 56



Цитата(aktuba @  7.6.2012,  00:45 Найти цитируемый пост)
Ну может совсем немного... Но в целом сказал как есть ;)

Да нет в роутинге Sinatra никаких ограничений, делай любой роут какой захочешь:
Код

get %r{/([^/]+)?/?([^/]+)?/?(\d+)?} do |controller, action, id|
  controller ||= 'main'
  action ||= 'index'
  [controller, action, id].join(' / ')
end

Для реального использования, конечно, надо получше продумать регулярку в части controller и action, но в качестве proof-of-concept и так сойдёт.


Цитата(aktuba @  7.6.2012,  00:45 Найти цитируемый пост)
Почитал про rails, посмотрел примеры, бенчмарки. Не хочу юзать рельсы )

Да не всё так страшно, в рельсах только запуск приложения подтормаживает. В остальном всё ok. А бенчмарки - они как всегда забывают, что реальные приложения упираются прежде всего в кривые алгоритмы, медленные выборки из БД и т.п., по сути влияние фреймворка стоит во втором десятке факторов, влияющих на производительность.
Кроме того бенчмарки никогда не сравнивают оптимальные для конкретной задачи решения. Т.е. для вывода "Hello world!" они непременно заюзают весь Rails-стек, вместо
Код

match '/hello' => proc { |env| [200, {}, ["Hello world!"]] } # в config/routes.rb


Цитата(aktuba @  7.6.2012,  00:45 Найти цитируемый пост)
мечта - найти ko3 на руби.

Kohana - это ведь один из клонов Rails под PHP  smile 
Если мечта добавлять нужное на основу, то есть rails-api

Цитата(aktuba @  7.6.2012,  00:45 Найти цитируемый пост)
В padrino отсутствует поддержка mysql2

Это как? Гем не подключен по умолчанию?  smile 

Цитата(aktuba @  7.6.2012,  00:45 Найти цитируемый пост)
Например, я очень не люблю кодогенераторы.

Кто-то заставляет тебя их использовать? Хотя на стадии обучения кодогенераторы - вещь очень полезная, чтобы вникнуть в style guide конкретного фреймворка.

Цитата(aktuba @  7.6.2012,  00:45 Найти цитируемый пост)
а orm/active record я обхожу стороной 

Очень зря. Обходить best practices стороной из-за того что под PHP кривая реализация попалась весьма странно, под PHP нормальные реализации вообще редкость... Помню ActiveRecord в Code Igniter, так там от этого паттерна ничего кроме названия нет.




--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Ruby: Общие вопросы"
source777
  • С чего начать? начинаем
  • Ссылки на полезные ресурсы смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1767 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.