что такое контроллер в синатре? - PullRequest
10 голосов
/ 04 мая 2011

Меня спросили, почему "я создавал сложные переменные Ruby в моем представлении. Разве эти переменные не должны быть объявлены моим контроллером? "

Является ли мой контроллер sinatra моим .rb файлом? У меня есть один файл .rb и просмотр просмотров.

Ответы [ 5 ]

17 голосов
/ 04 мая 2011

Вы можете настроить идею контроллеров, выполнив (в 1.9.2) это в верхней части вашего основного файла .rb

Dir.glob("controllers/*.rb").each { |r| require_relative r }

Для этого потребуется_относительный каждый файл .rb в папке с именем controllers /

Оттуда вы можете реализовать нормальную маршрутизацию, как вы делали это ранее в основном файле .rb. Пожалуйста, посмотрите на rstat.us на Github.

Редактировать: Rstat.us перешел на rails3, и, несмотря на свою полезность, вам, возможно, придется вернуться к многочисленным коммитам в ветке master, чтобы узнать, как они использовались.

6 голосов
/ 04 мая 2011

Каждый маршрут 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};
6 голосов
/ 04 мая 2011

Sinatra из коробки не имеет стандартного фреймворка 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

1 голос
/ 14 февраля 2012

@ CaleyWoods: спасибо за ссылку на rstat.us

Для тех, кто ищет версию Sinatra, вот ссылка на коммит Sinatra: https://github.com/hotsh/rstat.us/tree/00b27505681d80b3943fd9b9e9791f664a04cf39

(так что вам не нужно перелистывать историю коммитов ;-))

0 голосов
/ 25 января 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...