[ruby] 여러 파일을 통해 더 큰 프로젝트에 Sinatra 사용

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 앱을 개발할 때 상용구에 추가 할 수 있습니다.

다음은 모든 프로젝트에서 만들고 사용한 것입니다.

https://github.com/rziehl/sinatra-boilerplate


답변

나는 이것이 오래된 쿼리라는 것을 알고 있지만 여전히 아무도 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

https://github.com/katgironpe/simple-sinatra-mvc