Что такое контроллер в синатра?

Меня спросили, почему "я создавал сложные переменные 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

Ответ 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, но вы также можете добавить в свой файл приложения и не забудьте настроить структуру каталогов.