Что такое контроллер в синатра?
Меня спросили, почему "я создавал сложные переменные Ruby на мой взгляд.
Не должны ли эти переменные быть объявлены моим контроллером? "
Является ли мой синатровый контроллер моим .rb файлом? У меня есть один файл .rb и виды просмотра.
Ответы
Ответ 1
Каждый маршрут 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};
Ответ 2
Вы можете настроить идею контроллеров, выполнив (в 1.9.2) это в верхней части основного файла .rb
Dir.glob("controllers/*.rb").each { |r| require_relative r }
Это потребует_relative каждого .rb файла в папке, называемой контроллерами /
Оттуда вы можете реализовать обычную маршрутизацию, как это делалось ранее в основном файле .rb. Пожалуйста, посмотрите rstat.us на Github.
Изменить: Rstat.us перешел на rails3, и, хотя он по-прежнему полезен, вам, возможно, придется возвратить многочисленные коммиты на главной ветке, чтобы узнать, как они были использованы.
Ответ 3
Синатра из коробки не имеет стандартной структуры MVC. Поэтому, хотя вы не хотите оставлять все в основном файле вида, вы также не имеете технически "контроллера", чтобы вставить это. Разделение вашего приложения на разные функциональные возможности, вероятно, будет лучшим подходом, чтобы упростить его. Потяните большие области функциональности в отдельные классы и небольшие вещи в вспомогательные библиотеки.
Взглянув на то, как другие могут это сделать, этот пост должен содержать несколько хороших примеров для изучения: https://stackoverflow.com/questions/2075758/real-life-examples-of-sinatra-applications
Если структура MVC становится чем-то, что вы действительно считаете нужным, взгляните на Padrino (http://padrinorb.com)
Немного связанная почта:
https://softwareengineering.stackexchange.com/questions/14293/ruby-sinatra-best-practices-for-project-structure
Ответ 4
@CaleyWoods: спасибо за ссылку на rstat.us
Для тех, кто ищет версию Sinatra, вот ссылка на фиксацию Sinatra:
https://github.com/hotsh/rstat.us/tree/00b27505681d80b3943fd9b9e9791f664a04cf39
(так что вам не нужно тралить историю фиксации;-))
Ответ 5
Это только для наследования позже, если у вас есть контроллеры, которые наследуются от 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, но вы также можете добавить в свой файл приложения и не забудьте настроить структуру каталогов.