Руби ж / Синатра: что такое эквивалент a. js.Эрб с рельсов?



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



Есть ли способ использовать их в Синатре? или эквивалент?

497   3  

3 ответов:

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

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

Помощники / партиалы.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

Маршруты / ошибка.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

Просмотры / ошибка.haml

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

Просмотры/_bugtitle.haml

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

Просмотры / _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

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

erb "mypage.js".to_sym

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

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

Comments

    Ничего не найдено.