여러 파일을 통해 더 큰 프로젝트에 Sinatra 사용
Sinatra에서는 모든 경로 핸들러가 하나의 파일로 작성되는 것 같습니다. 제가 제대로 이해한다면 하나의 크고 작은 컨트롤러 역할을 합니다.별도의 독립 파일로 분할할 수 있는 방법이 없을까요? 그래서 누군가가 "/"를 부른다고 가정하면 - 하나의 동작이 실행되고 "/posts/2"와 같은 것이 수신되면 다른 동작 - 유사한 논리가 PHP에 적용됩니다.
여기 제가 사용하는 Sinatra 앱을 위한 기본 템플릿이 있습니다. (제가 운영하는 대형 앱에는 벤더의 보석을 제외하고 200개 이상의 파일이 있습니다. 75-100개의 명시적 경로를 포함합니다.이러한 경로 중 일부는 추가적인 50개 이상의 경로 패턴을 포함하는 Regexp 경로입니다.)사용하여 합니다.
thin -R config.ru start
편집: 저는 현재 아래의 리브리츠를 기반으로 저만의 몽크 스켈레톤을 유지하고 있습니다.이를 사용하여 내 템플릿을 자신의 프로젝트의 기초로 복사하려면 다음과 같이 하십시오.
# Before creating your project
monk add riblits git://github.com/Phrogz/riblits.git
# Inside your empty project directory
monk init -s riblits
파일 레이아웃:
config.ru앱.스캐너도우미/init.dll부분 s.s.모델/init.dlluser.sys경로/init.dlllogin.sys본대의뷰/레이아웃.햄로그 인.햄을메인 햄
config.ru
root = ::File.dirname(__FILE__)
require ::File.join( root, 'app' )
run MyApp.new
앱.스캐너
# 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'
조력자들/init.milit.
# encoding: utf-8
require_relative 'partials'
MyApp.helpers PartialPartials
require_relative 'nicebytes'
MyApp.helpers NiceBytes
도움을 주는 사람들/보조원들
# 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
도우미/큐바이트 수
# 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
모델/init.models
# encoding: utf-8
require 'sequel'
DB = Sequel.postgres 'dbname', user:'bduser', password:'dbpass', host:'localhost'
DB << "SET CLIENT_ENCODING TO 'UTF8';"
require_relative 'users'
models/user.models
# encoding: utf-8
class User < Sequel::Model
# ...
end
routes/init.message
# encoding: utf-8
require_relative 'login'
require_relative 'main'
항로/항공편
# 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
항로/주요 항로
# encoding: utf-8
class MyApp < Sinatra::Application
get "/" do
@title = "Welcome to MyApp"
haml :main
end
end
견해/의견
!!! 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 을 통해 '자동 설치'할 수 있습니다.보석을 얻으면 위에 링크된 지침을 사용하여 샘플 앱을 생성합니다.
본인이 원하지 않는 한 실제 개발에 몽크를 사용할 필요가 없습니다(사실 현재는 아닐 수도 있다고 생각합니다).요점은 원하는 경우 MVC 스타일(별도의 컨트롤러와 같은 경로 파일)로 앱을 쉽게 구성할 수 있는 방법을 확인하는 것입니다.
Mongk가 처리하는 방식을 살펴보면 매우 간단합니다. 주로 별도의 디렉토리에 파일을 요구하는 문제입니다. (root_path를 정의해야 합니다.)
Dir[root_path("app/**/*.rb")].each do |file|
require file
end
Google에서 "Sinatra 상용판"을 검색하여 다른 사람들이 어떻게 Sinatra 애플리케이션을 배치하는지에 대한 아이디어를 얻으십시오.그것으로부터 여러분은 아마도 여러분의 필요에 맞는 것을 찾거나 단순히 여러분만의 것을 만들 수 있을 것입니다.그것은 하기에 그리 어렵지 않습니다.당신이 더 많은 시나트라 앱을 개발함에 따라, 당신은 당신의 상용판에 추가할 수 있습니다.
다음은 제가 만든 모든 프로젝트에 사용한 것입니다.
https://github.com/rziehl/sinatra-boilerplate
오래된 질문인 건 알지만 아무도 파드리노를 언급하지 않았다는 게 믿어지지 않아요. 시나트라 위에 파드리노를 프레임워크로 사용하거나 관심 있는 보석만 조각조각 추가할 수 있습니다.엉덩이 열 개나 차!
대규모 프로젝트를 위한 Sinatra의 모듈화의 핵심은 기본 도구를 사용하는 방법을 배우는 것입니다.
SitePoint에는 모듈식 시나트라 앱과 도우미를 볼 수 있는 매우 좋은 튜토리얼이 있습니다.하지만 당신은 한 가지 중요한 세부 사항에 특별한 주의를 기울여야 합니다.당신은 여러 개의 시나트라 앱을 보관하고 Rackup과 함께 탑재합니다.기본 앱을 작성하는 방법을 알게 되면 해당 튜토리얼의 config.ru 파일을 보고 독립적인 시나트라 앱을 탑재하는 방법을 관찰합니다.
Rack과 함께 Sinaatra를 실행하는 법을 배우면 모듈화 전략의 완전히 새로운 세계가 열릴 것입니다.이것은 분명히 정말 유용한 것을 시도하도록 유도합니다. 이제 각 하위 응용 프로그램에 대해 개별 Gems를 보유하는 것에 의존할 수 있습니다. 이를 통해 모듈을 쉽게 버전화할 수 있습니다.
앱에 보석 모듈을 사용하는 힘을 과소평가하지 마십시오.잘 구분된 환경에서 실험 변경사항을 쉽게 테스트하고 쉽게 배포할 수 있습니다.뭔가 잘못되면 되돌리기도 쉽습니다.
코드를 구성하는 방법은 수천 가지가 있으므로 Rails와 유사한 레이아웃을 얻는 것은 문제가 되지 않습니다.그러나 자신의 구조를 사용자 정의하는 방법에 대한 몇 가지 좋은 게시물도 있습니다.그 게시물은 대부분의 웹 개발자들의 다른 빈번한 요구를 다루고 있습니다.
시간이 되신다면 루비 기반 웹 애플리케이션의 공통점인 랙에 대해 자세히 알아보시기 바랍니다.작업 방식에 미치는 영향은 훨씬 적을 수 있지만 대부분의 사용자가 애플리케이션에서 수행하는 특정 작업은 항상 랙 미들웨어에 더 적합합니다.
한 프로젝트를 제 접근 은 동한사이다프방호은법스는하팅를일트로젝양서에를 사용하는 입니다.sinatra/namespace
다음과 같은 방식으로:
server.sys
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_some project.dll
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_some project.haml
!!!
%html
...
제가 사용한 하위 프로젝트에 대한 또 다른 세부 사항은 어떤 종류의 글로벌 변수에 그들의 이름, 설명 및 경로를 추가하는 것이었습니다."/"
가이드 홈페이지를 만들려고 하는데, 저는 지금 스니펫을 가지고 있지 않습니다.
여기서 문서 읽기:
Sinatra는 애플리케이션을 Ruby Modules로 분해할 수 있으며, Sinatra "register" 방법이나 "helper" 방법을 통해 다음과 같이 가져올 수 있습니다.
조력자들
require 'sinatra/base'
module Sinatra
module Sample
module Helpers
def require_logged_in()
redirect('/login') unless session[:authenticated]
end
end
end
end
경로 지정/foo.foo.foo.foo.foo.foo
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
앱.스캐너
#!/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년 초 레드닷 루비콘프 때 제게 설명이 되었고, 그들은 특히 거의 유지되지 않는 지금은 스님을 사용하는 것이 정말 선택적이라고 말했습니다.
이것은 ActiveRecord를 사용하려는 사람들에게 좋은 시작입니다.
심플 시나트라 MVC
https://github.com/katgironpe/simple-sinatra-mvc
언급URL : https://stackoverflow.com/questions/5015471/using-sinatra-for-larger-projects-via-multiple-files
'programing' 카테고리의 다른 글
layoutSubviews는 언제 호출됩니까? (0) | 2023.05.31 |
---|---|
현재 실행 중인 메서드의 이름을 가져옵니다. (0) | 2023.05.31 |
Ruby에서 임의 문자열을 생성하는 방법 (0) | 2023.05.31 |
Android에서 내 응용 프로그램의 메시지만 가져오려면 LogCat을 필터링하시겠습니까? (0) | 2023.05.31 |
Bash에서 따옴표로 묶은 문자열 내에서 환경 변수를 사용하는 방법 (0) | 2023.05.26 |