একাধিক ফাইলের মাধ্যমে বৃহত প্রকল্পের জন্য সিনেট্রা ব্যবহার করা


184

মনে হচ্ছে সিনট্রাতে সমস্ত রুট হ্যান্ডলারগুলি একটি একক ফাইলে লেখা হচ্ছে, যদি আমি সঠিকভাবে বুঝতে পারি তবে এটি একটি বড় / ছোট নিয়ামক হিসাবে কাজ করে। এটিকে পৃথক পৃথক পৃথক ফাইলে বিভক্ত করার কোনও উপায় আছে কি, সুতরাং যখন বলি যে কেউ "/" কল করে - একটি ক্রিয়াকলাপ কার্যকর হয় এবং যদি "/ পোষ্টস / 2" এর মতো স্মিথ পাওয়া যায় তবে পিএইচপি-তে প্রয়োগ হওয়া অনুরূপ যুক্তি ?

উত্তর:


394

আমি যে সিনেট্রা অ্যাপ্লিকেশনগুলি ব্যবহার করি তার জন্য এখানে একটি প্রাথমিক টেম্পলেট is (আমার বৃহত্তর অ্যাপ্লিকেশনগুলিতে এই জাতীয় 200+ ফাইল বিচ্ছিন্ন হয়েছে, বিক্রেতাদের রত্নগুলি গণনা করা হচ্ছে না, 75-100 স্পষ্ট রুটগুলি আবরণ করা হয়। এর কয়েকটি রুটই অতিরিক্ত 50+ রুটের নিদর্শনগুলিকে আচ্ছাদন করে রেগএক্সপুট রুট।) পাতলা ব্যবহার করার সময়, আপনি একটি চালনা করেন এই মত অ্যাপ্লিকেশন ব্যবহার করে:
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
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'

 
সাহায্যকারী / init.rb

# encoding: utf-8
require_relative 'partials'
MyApp.helpers PartialPartials

require_relative 'nicebytes'
MyApp.helpers NiceBytes

 
সাহায্যকারী / 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

 
সাহায্যকারী / 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

 
মডেল / 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

 
যাত্রাপথ / init.rb

# encoding: utf-8
require_relative 'login'
require_relative 'main'

 
যাত্রাপথ / 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

 
যাত্রাপথ / main.rb

# encoding: utf-8
class MyApp < Sinatra::Application
  get "/" do
    @title = "Welcome to MyApp"        
    haml :main
  end
end

 
মতামত / 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

11
উপরের কাঠামোর সম্পর্কে বিশেষত একটি দুর্দান্ত জিনিস - বিশেষত স্থাপন require "sequel"এবং DBপ্রাথমিকভাবে ফাইলগুলির জন্য models/init.rbব্যবহার require_relativeকরা - আপনি আপনার modelsডিরেক্টরিতে সিডি করতে পারেন , একটি আইআরবি কনসোল খুলতে require './init'পারেন এবং টাইপ করতে পারেন এবং ইন্টারেক্টিভ অনুসন্ধানের জন্য আপনার সম্পূর্ণ ডাটাবেস এবং মডেল সেটআপ লোড করা যেতে পারে ।
ফ্রেগজ

1
দুর্দান্ত উদাহরণ কাঠামো, আমার মতো সিনেট্রা নুব জন্য উপযুক্ত, চিয়ার্স।
ব্যারি জর্ডান

27
আমি একটি ভিন্ন পদ্ধতির ব্যবহার করেছি। রুবিতে ব্যবহারকারী এবং পরিষেবাগুলির মতো সমস্ত ব্যবসায়িক যুক্তিকে কোড করুন, কোনও 'সায়াত্রা' প্রয়োজন নেই। এটি যুক্তিটি নিজের পক্ষে দাঁড় করায়। তারপরে আমি একক অ্যাপ্লিকেশন ফাইলটি বিভিন্ন ক্লাসের দায়িত্বগুলি ডোল করার জন্য ব্যবহার করি, তাই প্রতি রুটে প্রায় 3 লাইন কোড। টিপিক্যাল অ্যাপ্লিকেশনটিতে অনেকগুলি রুট নেই, সুতরাং আমার অ্যাপ্লিকেশন ফাইলটি আসলে এত দীর্ঘ নয়।
টম অ্যান্ডারসন

1
একাধিক ফাইলে কোনও শ্রেণি সংজ্ঞায়িত করা কি সাধারণ অভ্যাস? আপনি প্রতিটি ফাইলটিতে বারবার 'মাই অ্যাপ' পুনরায় সংজ্ঞা দিচ্ছেন। আমি রুবিতে নতুন তাই এটি আমার কাছে অদ্ভুত বলে মনে হচ্ছে। এর পিছনে কারণ কী?
0x সিনা

5
@ 0xSina এটি রুবির মধ্যে অস্বাভাবিক নয়। আপনি একটি শ্রেণি "সংজ্ঞায়িত" করেন না, আপনি "এটি আবার খুলুন"। উদাহরণস্বরূপ, Arrayক্লাসটি মূল গ্রন্থাগার দ্বারা সংজ্ঞায়িত করা হয়েছে তবে আপনি পরে ব্যবহার করে "monkeypatch" করতে পারেন class Array; def some_awesome_method; endএবং ক) পূর্ববর্তী সমস্ত অ্যারে কার্যকারিতা সংরক্ষণ করা হয়েছে এবং খ) সমস্ত অ্যারে উদাহরণগুলি আপনার নতুন কোড পাবে। রুবির ক্লাসগুলি কেবলমাত্র বস্তু, এবং যে কোনও সময় বৃদ্ধি এবং পরিবর্তিত হতে পারে।
ফ্রোগজ

10

একেবারে। এর উদাহরণ দেখতে আমি এখানে বর্ণিত সন্ন্যাসী রত্ন ডাউনলোড করার পরামর্শ দিচ্ছি:

https://github.com/monkrb/monk

আপনি এটি rubygems.org এর মাধ্যমে 'রত্ন ইনস্টল' করতে পারেন। আপনার কাছে রত্নটি তৈরি হয়ে গেলে উপরের লিঙ্কযুক্ত নির্দেশাবলী ব্যবহার করে একটি নমুনা অ্যাপ্লিকেশন তৈরি করুন।

নোট করুন যে আপনি না চাইলে আপনার প্রকৃত বিকাশের জন্য সন্ন্যাসীকে ব্যবহার করতে হবে না (আসলে আমি মনে করি এটি বর্তমান নাও হতে পারে)। মুল বক্তব্যটি আপনি কীভাবে সহজেই এমভিসি স্টাইলে আপনার অ্যাপ্লিকেশনটি কাঠামোগত করতে পারেন তা দেখার জন্য (পৃথক নিয়ন্ত্রকের মতো রুট ফাইলগুলির সাথে) আপনি চান।

এটি খুব সহজ যদি আপনি সন্ন্যাসী এটি পরিচালনা করেন কী করে দেখুন, বেশিরভাগ ক্ষেত্রে পৃথক ডিরেক্টরিতে ফাইলের প্রয়োজন হয় এরকম কিছু (আপনাকে রুট_পথটি সংজ্ঞায়িত করতে হবে):

Dir[root_path("app/**/*.rb")].each do |file|
    require file
end

7
init.rbউপরের বিপরীতে একটি সুস্পষ্ট ব্যবহার সম্পর্কে একটি দুর্দান্ত বিষয় হ'ল আপনি যদি পরস্পরের উপর নির্ভরশীল ফাইল রেখে থাকেন তবে আপনি লোডিংয়ের ক্রমটি নিয়ন্ত্রণ করতে পারবেন।
ফোগজ

10

অন্যরা কীভাবে তাদের সিনাত্রা অ্যাপ্লিকেশনগুলি দিচ্ছে তার জন্য কিছু ধারণা পেতে "সিনেট্রা বয়লারপ্লেট" এর জন্য গুগল অনুসন্ধান করুন। সেখান থেকে আপনি সম্ভবত এমন একটি সন্ধান করতে পারেন যা আপনার প্রয়োজন অনুসারে উপযুক্ত বা কেবল নিজের তৈরি করতে পারে। এটি করা খুব কঠিন নয়। আপনি আরও সিনেট্রা অ্যাপ্লিকেশন বিকাশ করার সাথে সাথে আপনি আপনার বয়লারপ্লেটে যোগ করতে পারেন।

আমার সমস্ত প্রকল্পের জন্য আমি যা তৈরি করেছি এবং তা এখানে ব্যবহার করুন:

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


7

আমি জানি এটি একটি পুরানো ক্যোয়ারী তবে আমি এখনও বিশ্বাস করতে পারি না যে প্যাড্রিনো উল্লেখ করেছেন কেউই আপনি এটিকে সিনাত্রার শীর্ষে কাঠামো হিসাবে ব্যবহার করতে পারেন, বা টুকরোচলে কেবল আপনার আগ্রহী রত্ন যুক্ত করতে পারেন। এটি দশ পাছা গাধা লাথি!


আমি সম্মতি জানাই, আপনার প্যাড্রিনো একবার দেখে নেওয়া উচিত!
নিকোপেজ

2

একই সাইটে বিভিন্ন প্রকল্পের হোস্ট করার জন্য আমার পদ্ধতিটি 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
    ...

আমি যে সাব-প্রকল্পগুলি ব্যবহার করেছি সে সম্পর্কে আরও একটি বিবরণ হ'ল তাদের নাম, বিবরণ এবং রুটগুলি এক ধরণের গ্লোবাল ভেরিয়েবলের সাথে যুক্ত করা, যা "/"গাইডের হোমপৃষ্ঠা তৈরি করতে ব্যবহৃত হয় , তবে আমার এখনই স্নিপেট নেই।


1

ডক্স এখানে পড়া:

সিনাত্রা এক্সটেনশনস

এটি প্রতীয়মান হয় যে সিনাত্রা আপনাকে রুবি মডিউলগুলিতে আপনার অ্যাপ্লিকেশনটি পচন করতে দেয়, যা সিনেট্রা "রেজিস্টার" পদ্ধতি বা "সহায়ক" পদ্ধতির মাধ্যমে টানা যেতে পারে:

helpers.rb

require 'sinatra/base'

module Sinatra
  module Sample
    module Helpers

      def require_logged_in()
        redirect('/login') unless session[:authenticated]
      end

    end
  end
end

রাউটিং / 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

1

যখন সন্ন্যাসী আমার পক্ষে কাজ করেনি, আমি নিজে টেমপ্লেটগুলিতে কাজ শুরু করি।

আপনি যদি এটির বিষয়ে চিন্তা করেন তবে ফাইলগুলির সেট বেঁধে রাখার বিষয়ে বিশেষ কিছু নেই। ২০১২ সালের প্রথম দিকে রেডডটরবিবিফের সময় সন্ন্যাসী দর্শনের বিষয়টি আমাকে ব্যাখ্যা করা হয়েছিল এবং তারা আমাকে স্পষ্টভাবে বলেছে যে এটি ব্যবহার করা সত্যই alচ্ছিক বিশেষত এখন এটি খুব কমই রক্ষণাবেক্ষণ করা হয়েছে।

যারা অ্যাক্টিভেকর্ড ব্যবহার করতে চান তাদের জন্য এটি একটি ভাল শুরু:

সরল সিনাত্রা এমভিসি

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


1

বৃহত্তর প্রকল্পগুলির জন্য সিনট্রাতে সংশ্লেষণের মূলটি অন্তর্নিহিত সরঞ্জামগুলি ব্যবহার করতে শিখছে।

সাইটপয়েন্টের একটি খুব ভাল টিউটোরিয়াল রয়েছে সেখান থেকে আপনি মডুলার সিনেট্রা অ্যাপস এবং সহায়তাকারীদের দেখতে পাবেন। তবে আপনার একটি গুরুত্বপূর্ণ বিষয়ে বিশেষ মনোযোগ দেওয়া উচিত। আপনি একাধিক সিনাত্রা অ্যাপ্লিকেশন রাখুন এবং তাদের র্যাকআপের মাধ্যমে মাউন্ট করুন। একবার আপনি কীভাবে বেসিক অ্যাপটি লিখতে পারবেন সেই টিউটোরিয়ালের কনফিগারেশন.রু ফাইলটি দেখুন এবং তারা কীভাবে স্বাধীন সিনেট্রা অ্যাপ্লিকেশনগুলি মাউন্ট করবেন তা পর্যবেক্ষণ করুন।

একবার আপনি র্যাকের সাথে সিনট্রা চালানো শিখলে মডুলারিটির কৌশলগুলির একটি সম্পূর্ণ নতুন পৃথিবী উন্মুক্ত হবে। স্পষ্টতই এটি সত্যিই দরকারী কিছু চেষ্টা করার জন্য আমন্ত্রণ জানিয়েছে: এখন আপনি প্রতিটি উপ অ্যাপ্লিকেশনের জন্য স্বতন্ত্র রত্ন রাখার উপর নির্ভর করতে পারেন, এটি আপনাকে মডিউলগুলি সহজেই সংস্করণে সক্ষম করতে পারে।

আপনার অ্যাপ্লিকেশনটির জন্য রত্ন-মডিউলগুলি ব্যবহার করার শক্তিটিকে হ্রাস করবেন না। আপনি সহজেই একটি সীমাবদ্ধ পরিবেশে পরীক্ষামূলক পরিবর্তনগুলি পরীক্ষা করতে পারেন এবং এগুলি সহজেই স্থাপন করতে পারেন। কিছু ভুল হয়ে গেলে ফিরে যাওয়াও সমান সহজ।

আপনার কোডটি সংগঠিত করার জন্য এক হাজার উপায় রয়েছে, সুতরাং এটিগুলি রিলের মতো লেআউট পাওয়ার চেষ্টা করে ক্ষতি করবে না। তবে আপনার নিজস্ব কাঠামোটি কীভাবে কাস্টমাইজ করা যায় সে সম্পর্কে কয়েকটি দুর্দান্ত পোস্ট রয়েছে । এই পোস্টটি বেশিরভাগ ওয়েব বিকাশকারীদের অন্যান্য ঘন প্রয়োজনীয়তাগুলি কভার করে।

আপনার যদি সময় থাকে তবে আমি আপনাকে রবি, যে কোনও রুবি ভিত্তিক ওয়েব অ্যাপ্লিকেশনের জন্য সাধারণ ক্ষেত্র সম্পর্কে আরও জানতে উত্সাহিত করব। আপনি কীভাবে আপনার কাজটি করেন তার এটির খুব কম প্রভাব ফেলতে পারে তবে বেশিরভাগ লোকেরা তাদের অ্যাপ্লিকেশনগুলিতে এমন কিছু কাজ করে যা র্যাক মিডলওয়্যার হিসাবে আরও ভাল ফিট করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.