Меня спросили, почему "я создавал сложные переменные Ruby на мой взгляд. Не должны ли эти переменные быть объявлены моим контроллером? "
Является ли мой синатровый контроллер моим .rb файлом? У меня есть один файл .rb и виды просмотра.
Меня спросили, почему "я создавал сложные переменные Ruby на мой взгляд. Не должны ли эти переменные быть объявлены моим контроллером? "
Является ли мой синатровый контроллер моим .rb файлом? У меня есть один файл .rb и виды просмотра.
Каждый маршрут Sinatra можно считать собственным контроллером в типичной настройке MVC. Для вашего примера:
require 'sinatra'
require 'json'
get "/foo" do
# This might take many lines of excellent code to form your data
@data = some_complex_array_hash_combo
haml :foo
end
И затем в foo.haml
:
:javascript
var data = #{@data.to_json};
Вы можете настроить идею контроллеров, выполнив (в 1.9.2) это в верхней части основного файла .rb
Dir.glob("controllers/*.rb").each { |r| require_relative r }
Это потребует_relative каждого .rb файла в папке, называемой контроллерами /
Оттуда вы можете реализовать обычную маршрутизацию, как это делалось ранее в основном файле .rb. Пожалуйста, посмотрите rstat.us на Github.
Изменить: Rstat.us перешел на rails3, и, хотя он по-прежнему полезен, вам, возможно, придется возвратить многочисленные коммиты на главной ветке, чтобы узнать, как они были использованы.
Синатра из коробки не имеет стандартной структуры MVC. Поэтому, хотя вы не хотите оставлять все в основном файле вида, вы также не имеете технически "контроллера", чтобы вставить это. Разделение вашего приложения на разные функциональные возможности, вероятно, будет лучшим подходом, чтобы упростить его. Потяните большие области функциональности в отдельные классы и небольшие вещи в вспомогательные библиотеки.
Взглянув на то, как другие могут это сделать, этот пост должен содержать несколько хороших примеров для изучения: https://stackoverflow.com/questions/2075758/real-life-examples-of-sinatra-applications
Если структура MVC становится чем-то, что вы действительно считаете нужным, взгляните на Padrino (http://padrinorb.com)
Немного связанная почта:
@CaleyWoods: спасибо за ссылку на rstat.us
Для тех, кто ищет версию Sinatra, вот ссылка на фиксацию Sinatra: https://github.com/hotsh/rstat.us/tree/00b27505681d80b3943fd9b9e9791f664a04cf39
(так что вам не нужно тралить историю фиксации;-))
Это только для наследования позже, если у вас есть контроллеры, которые наследуются от ApplicationController. Удачи! Если вы используете файл config.ru для своего приложения, это может помочь.
require 'active_support'
require 'sinatra/base'
APP_ROOT = Pathname.new(File.expand_path('../', __FILE__))
# We have to do this in case we have controllers that inherit from each other.
Dir[APP_ROOT.join('app', 'controllers', '*.rb')].each do |controller_file|
filename = File.basename(controller_file).gsub('.rb', '')
autoload ActiveSupport::Inflector.camelize(filename), controller_file
end
Это предполагает, что вы поместите этот код в свой config.ru, но вы также можете добавить в свой файл приложения и не забудьте настроить структуру каталогов.