Ruby w / Sinatra: что эквивалентно .js.erb из рельсов? - PullRequest
3 голосов
/ 01 февраля 2011

.js.erb - это хорошо, потому что вы можете использовать их для замены частей страницы без необходимости покидать текущую страницу, что дает более чистое и неприкрытое ощущение сайту / приложению.Есть ли способ использовать их в синатре?или эквивалент?

Ответы [ 3 ]

3 голосов
/ 01 февраля 2011

Просто добавьте .js в конец символа, который вы передаете erb (). А-ля (позвонить на mypage.js.erb):

erb "mypage.js".to_sym

Грязно, но работает.

2 голосов
/ 01 февраля 2011

Исходя из вашего описания, я предполагаю, что вы хотите, чтобы части страницы редактировались и заменялись через AJAX.Если это не так, пожалуйста, уточните.

Я делаю это в своих приложениях Sinatra, включая (свою) библиотеку AJAXFetch jQuery и написание кода, как показано ниже.Это позволяет мне использовать частичное как при рендеринге страницы изначально, так и при редактировании через AJAX, для максимальной DRYness.Библиотека AJAXFetch обрабатывает всю выборку / свопинг AJAX только через разметку, без необходимости писать собственный JS на страницах, которые ее используют.

helpers / partials.rb

require 'sinatra/base'
module Sinatra
  module PartialPartials
    ENV_PATHS = %w[ REQUEST_PATH PATH_INFO REQUEST_URI ] 
    def spoof_request( uri, headers=nil ) 
      new_env = env.dup 
      ENV_PATHS.each{ |k| new_env[k] = uri.to_s } 
      new_env.merge!(headers) if headers
      call( new_env ).last.join 
    end
    def partial( page, variables={} )
      haml page, {layout:false}, variables
    end
  end
  helpers PartialPartials
end

route / bug.rb

get '/bug/:bug_id' do
  if @bug = Bug[params[:bug_id]]
    # ...
    haml :bug
  end
end

# Generate routes for each known partial
partials = %w[ bugdescription bughistory bugtitle fixer
               pain project relatedbugs status tags version votes ]
partials.each do |part|
  [ part, "#{part}_edit" ].each do |name|
    get "/partial/#{name}/:bug_id" do
      id = params[:bug_id]
      login_required
      halt 404, "(no bug ##{id})" unless @bug = Bug[id]
      partial :"_#{name}"
    end
  end
end

post "/update_bug/:partial" do
  id = params[:bug_id]
  unless params['cancel']=='cancel'
    # (update the bug based on fields)
    @bug.save
  end
  spoof_request "/partial/#{params[:partial]}/#{id}", 'REQUEST_METHOD'=>'GET'
end

views / bug.haml

#main
  #bug.section
    = partial :_bugtitle
    .section-body
      = partial :_bugdescription
   <!-- many more partials used -->

views / _bugtitle.haml

%h1.ajaxfetch-andswap.editable(href="/partial/bugtitle_edit/#{@bug.pk}")= title

views / _bugtitle_edit.haml

%form.ajaxfetch-andswap(method='post' action='/update_bug/bugtitle')
  %input(type="hidden" name="bug_id" value="#{@bug.id}")
  %h1
    %input(type="text" name="name" value="#{h @bug.name}")
    %span.edit-buttons
      %button(type="submit") update
      %button(type="submit" name="cancel" value="cancel") cancel
0 голосов
/ 01 февраля 2011

sinatra на самом деле не предназначена для использования в качестве полностью стекового фреймворка.Он должен быстро доставить вас в дорогу.Вы можете использовать erb отдельно, а затем загрузить в свой код sinatra.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...