Ответы пользователя по тегу Sinatra
  • Почему в ruby объект преобразуется в строку при передаче в метод?

    AMar4enko
    @AMar4enko
    Потому что промежуточное хранилище что resque, что sidekiq, хранит данные в виде строк, чаще всего в redis. Поэтому о передаче объектов, подобных Class, забудьте (об этом, кстати, написано в документации).
    При правильно спроектированном приложении необходимости передавать сложные объекты в воркеры нет. Судя по всему, вы неправильно интегрировали resque в проект - настройки можно передать воркеру при старте resque.
    Внутри библиотеки используется json-формат для хранения параметров вызова, по-моему, поэтому в качестве параметров воркеров можно использовать объекты с .to_json
    Ответ написан
    Комментировать
  • Как строить ссылки в Sinatra с учетом обратного прокси?

    AMar4enko
    @AMar4enko
    Способ "в лоб" - поменять информацию в env перед обработкой запроса.
    Как-то так. Можно на уровне Rack, можно на уровне приложения.
    before do
        env['PATH_INFO'].sub!(/^\/blah/, '')
    end

    Там дальше Sinatra будет использовать эти значения для своих нужд.
    Сделайте pp env, посмотрите, какие ключи за что отвечают и поменяйте.
    Ответ написан
    Комментировать
  • Где хранить параметры инициализации rack приложения?

    AMar4enko
    @AMar4enko
    config.ru
    require_relative 'config/boot'
    
    run Grape::RackBuilder.application


    config/boot.rb
    # Defines our constants
    RACK_ENV = ENV['RACK_ENV'] || 'development'  unless defined?(RACK_ENV)
    APP_ROOT = File.expand_path('../..', __FILE__) unless defined?(APP_ROOT)
    
    # Load our dependencies
    require 'rubygems' unless defined?(Gem)
    require 'bundler/setup'
    # Load initializers
    Bundler.require(:default, RACK_ENV)
    
    require_relative 'settings'
    
    ApplicationSettings.source File.expand_path('config/application.yml', APP_ROOT)
    ApplicationSettings.root = APP_ROOT
    
    require_relative 'database'
    
    Dir[File.join(File.dirname(__FILE__),'initializers/**/*.rb')].each {|file_name| require file_name}
    
    Rabl.configure do |config|
      config.include_json_root = false
    end
    
    Grape::RackBuilder.setup do
      %w{api models lib uploaders models abilities jobs search_indexes}.each do |path|
        add_source_path ApplicationSettings.root("#{path}/**/*.rb")
        add_source_path ApplicationSettings.root("#{path}/*.rb")
      end
    
      use Warden::Manager do |config|
        config.strategies.add(:public_access_token, PublicTokenStrategy)
        config.default_strategies :public_access_token
        config.failure_app = API::Application
        config.intercept_401 = false
      end
    
      use Rack::Config do |env|
        env['api.tilt.root'] = ApplicationSettings.root('rabl')
      end
    
      mount 'API::Application', to: '/api'
    
      logger ApplicationSettings.logger(:rackbuilder)
    end.boot!


    Помимо config.ru инициализация приложения нужна также и в spec_helper для тестирования. Поэтому разбивать обязательно.
    Ответ написан
    Комментировать
  • Custom routes в Sinatra (Padrino)?

    AMar4enko
    @AMar4enko
    Все, увидел — вы про наследование «CBaseUrlRule».
    Нет, в Sinatra такого нет.
    Ответ написан
  • Custom routes в Sinatra (Padrino)?

    AMar4enko
    @AMar4enko
    Вам просто хелпер для вьюх нужно написать, что-то типа article_url_for.
    В Sinatra это можно сделать как-то так:
    helpers do
      def article_url_for(id)
        # тут уже напишете выборку объекта из базы или кэша и формирование url
      end
    end


    В Sinatra нет генератора url, потому что там контроллеры как таковые отсутствуют. Т.е. если у вас в Yii есть роуты вида
    '/<categoryName:\\w+>/<articleSlug:\\w+>' => "articles/read" 
    '/<id:\\d+>' => "articles/read"


    то вы можете написать экшн в виде
    function actionRead(id = null, categoryName = null, articleSlug = null){
        if(!empty(id))
               article = Article::model()->findByPk(id)
        else
               article = Article::model()->findByAttributes(..)
    }
    

    И генерировать урлы:
    $this->createUrl('articles/read', array('categoryName' => 'Books', 'slug' => 'Another-great-book')) //сгенерирует url первого вида 
    $this->createUrl('articles/read', array('id' => 123)) //сгенерирует url второго вида
    


    Для того, чтобы генерировать url первого вида, передавая id объекта, вам в Yii все равно придется писать хелпер, который вытащит объект из базы и сгенерирует url стандартным способом, передав туда соотв. параметры.
    Ответ написан
    Комментировать