Sinatra에서는 모든 경로 처리기가 단일 파일로 작성되고있는 것으로 보입니다. 올바로 이해하면 하나의 큰 / 작은 컨트롤러 역할을합니다. 별도의 독립 파일로 분할 할 수있는 방법이 있습니까? 따라서 누군가가 “/”를 호출한다고 가정하면-한 동작이 실행되고 “/ posts / 2″와 같은 smth가 수신되면 다른 동작-PHP에 적용되는 유사한 논리 ?
답변
내가 사용하는 Sinatra 앱의 기본 템플릿은 다음과 같습니다. (나의 더 큰 앱에는 공급 업체의 보석을 제외하고 75-100 개의 명시 적 경로를 포함하는 200 개 이상의 파일이 있습니다.이 경로 중 일부는 추가 50 개 이상의 경로 패턴을 포함하는 Regexp 경로입니다.) Thin을 사용할 때 다음을 사용하는 앱 :
thin -R config.ru start
편집 : 나는 이제 아래의 Riblits을 기반으로 내 자신의 몽크 골격을 유지 하고 있습니다 . 이 템플릿을 사용하여 템플릿을 자신의 프로젝트의 기초로 복사하려면
# Before creating your project
monk add riblits git://github.com/Phrogz/riblits.git
# Inside your empty project directory
monk init -s riblits
파일 레이아웃 :
config.ru app.rb 도우미 / init.rb partials.rb 모델 / init.rb user.rb 노선 / init.rb login.rb main.rb 견해/ layout.haml login.haml main.haml
config.ru
root = ::File.dirname(__FILE__)
require ::File.join( root, 'app' )
run MyApp.new
app.rb
# encoding: utf-8
require 'sinatra'
require 'haml'
class MyApp < Sinatra::Application
enable :sessions
configure :production do
set :haml, { :ugly=>true }
set :clean_trace, true
end
configure :development do
# ...
end
helpers do
include Rack::Utils
alias_method :h, :escape_html
end
end
require_relative 'models/init'
require_relative 'helpers/init'
require_relative 'routes/init'
helpers / init.rb
# encoding: utf-8
require_relative 'partials'
MyApp.helpers PartialPartials
require_relative 'nicebytes'
MyApp.helpers NiceBytes
helpers / partials.rb
# encoding: utf-8
module PartialPartials
def spoof_request(uri,env_modifications={})
call(env.merge("PATH_INFO" => uri).merge(env_modifications)).last.join
end
def partial( page, variables={} )
haml page, {layout:false}, variables
end
end
helpers / nicebytes.rb
# encoding: utf-8
module NiceBytes
K = 2.0**10
M = 2.0**20
G = 2.0**30
T = 2.0**40
def nice_bytes( bytes, max_digits=3 )
value, suffix, precision = case bytes
when 0...K
[ bytes, 'B', 0 ]
else
value, suffix = case bytes
when K...M then [ bytes / K, 'kiB' ]
when M...G then [ bytes / M, 'MiB' ]
when G...T then [ bytes / G, 'GiB' ]
else [ bytes / T, 'TiB' ]
end
used_digits = case value
when 0...10 then 1
when 10...100 then 2
when 100...1000 then 3
else 4
end
leftover_digits = max_digits - used_digits
[ value, suffix, leftover_digits > 0 ? leftover_digits : 0 ]
end
"%.#{precision}f#{suffix}" % value
end
module_function :nice_bytes # Allow NiceBytes.nice_bytes outside of Sinatra
end
models / init.rb
# encoding: utf-8
require 'sequel'
DB = Sequel.postgres 'dbname', user:'bduser', password:'dbpass', host:'localhost'
DB << "SET CLIENT_ENCODING TO 'UTF8';"
require_relative 'users'
모델 /user.rb
# encoding: utf-8
class User < Sequel::Model
# ...
end
routes / init.rb
# encoding: utf-8
require_relative 'login'
require_relative 'main'
routes / login.rb
# encoding: utf-8
class MyApp < Sinatra::Application
get "/login" do
@title = "Login"
haml :login
end
post "/login" do
# Define your own check_login
if user = check_login
session[ :user ] = user.pk
redirect '/'
else
redirect '/login'
end
end
get "/logout" do
session[:user] = session[:pass] = nil
redirect '/'
end
end
routes / main.rb
# encoding: utf-8
class MyApp < Sinatra::Application
get "/" do
@title = "Welcome to MyApp"
haml :main
end
end
views / layout.haml
!!! XML
!!! 1.1
%html(xmlns="http://www.w3.org/1999/xhtml")
%head
%title= @title
%link(rel="icon" type="image/png" href="/favicon.png")
%meta(http-equiv="X-UA-Compatible" content="IE=8")
%meta(http-equiv="Content-Script-Type" content="text/javascript" )
%meta(http-equiv="Content-Style-Type" content="text/css" )
%meta(http-equiv="Content-Type" content="text/html; charset=utf-8" )
%meta(http-equiv="expires" content="0" )
%meta(name="author" content="MeWho")
%body{id:@action}
%h1= @title
#content= yield
답변
물론. 이에 대한 예를 보려면 여기에 설명 된 Monk gem을 다운로드하는 것이 좋습니다.
https://github.com/monkrb/monk
rubygems.org를 통해 ‘gem install’할 수 있습니다. gem이 있으면 위에 링크 된 지침을 사용하여 샘플 앱을 생성하십시오.
원하지 않는 한 실제로 개발하기 위해 Monk를 사용할 필요는 없습니다 (사실 현재 최신 버전이 아닐 수도 있음). 요점은 원하는 경우 별도의 컨트롤러와 같은 경로 파일을 사용하여 MVC 스타일로 앱을 쉽게 구성하는 방법을 보는 것입니다.
Monk가 처리하는 방식을 살펴보면 매우 간단합니다. 주로 별도의 디렉토리에 파일이 필요합니다 (root_path를 정의해야 함).
Dir[root_path("app/**/*.rb")].each do |file|
require file
end
답변
Google에서 “Sinatra 상용구”를 검색하여 다른 사람들이 Sinatra 애플리케이션을 어떻게 배치하고 있는지에 대한 아이디어를 얻으십시오. 그로부터 당신은 아마 당신의 필요에 맞는 것을 찾거나 단순히 자신을 만들 수 있습니다. 너무 어렵지 않습니다. 더 많은 Sinatra 앱을 개발할 때 상용구에 추가 할 수 있습니다.
다음은 모든 프로젝트에서 만들고 사용한 것입니다.
답변
나는 이것이 오래된 쿼리라는 것을 알고 있지만 여전히 아무도 Padrino를 언급하지 않았다. Sinatra 위에 프레임 워크로 사용하거나 관심있는 보석 만 추가 할 수 있습니다. 엉덩이 10 개를 찼습니다!
답변
같은 사이트에서 다른 프로젝트를 호스팅하는 나의 접근 방식 sinatra/namespace
은 다음과 같은 방식 으로 사용 하는 것입니다.
server.rb
require "sinatra"
require "sinatra/namespace"
if [ENV["LOGNAME"], ENV["USER"]] == [nil, "naki"]
require "sinatra/reloader"
register Sinatra::Reloader
set :port, 8719
else
set :environment, :production
end
for server in Dir.glob "server_*.rb"
require_relative server
end
get "/" do
"this route is useless"
end
server_someproject.rb
module SomeProject
def self.foo bar
...
end
...
end
namespace "/someproject" do
set :views, settings.root
get "" do
redirect request.env["REQUEST_PATH"] + "/"
end
get "/" do
haml :view_someproject
end
post "/foo" do
...
SomeProject.foo ...
end
end
view_someproject.haml
!!!
%html
...
내가 사용한 하위 프로젝트에 대한 또 다른 세부 사항은 "/"
가이드 홈페이지를 만드는 데 사용되는 일종의 전역 변수에 이름, 설명 및 경로를 추가하는 것이 었지만 지금은 스 니펫이 없습니다.
답변
여기에서 문서를 읽으십시오.
Sinatra를 사용하면 Sinatra “register”메소드 또는 “helpers”메소드를 통해 애플리케이션을 Ruby 모듈로 분해 할 수 있습니다.
helpers.rb
require 'sinatra/base'
module Sinatra
module Sample
module Helpers
def require_logged_in()
redirect('/login') unless session[:authenticated]
end
end
end
end
routing / foos.rb
require 'sinatra/base'
module Sinatra
module Sample
module Routing
module Foos
def self.registered(app)
app.get '/foos/:id' do
# invoke a helper
require_logged_in
# load a foo, or whatever
erb :foos_view, :locals => { :foo => some_loaded_foo }
end
end
end
end
end
end
app.rb
#!/usr/bin/env ruby
require 'sinatra'
require_relative 'routing/foos'
class SampleApp < Sinatra::Base
helpers Sinatra::Sample::Helpers
register Sinatra::Sample::Routing::Foos
end
답변
수도사가 나를 위해 일하지 않았을 때, 나는 스스로 템플릿 작업을 시작했다.
그것에 대해 생각하면 파일 세트를 묶는 데 특별한 것이 없습니다. 수도사 철학은 2011 년 초 RedDotRubyConf 기간 동안 나에게 설명되었으며 특히 유지 관리가 거의되지 않기 때문에 특히 사용하는 것이 선택 사항이라고 구체적으로 말했습니다.
이것은 ActiveRecord를 사용하려는 사람들에게 좋은 시작입니다.
간단한 시나트라 MVC