【问题标题】:Ruby w/ Sinatra: what is the equivalent of a .js.erb from rails?带有 Sinatra 的 Ruby:与 Rails 中的 .js.erb 等效的是什么?
【发布时间】:2011-02-01 12:47:39
【问题描述】:

.js.erb 很不错,因为您可以使用它们来替换页面的某些部分,而无需离开当前页面,从而为网站/应用程序提供更干净和完整的感觉。

有没有办法在 sinatra 中使用它们?或等价物?

【问题讨论】:

  • 请原谅我对 Rails 的无知,但您能否解释(或链接到).js.erb 是什么以及在何处使用它,如果不是生成用于结果的 JavaScript 的简单模板视图页面渲染?

标签: ruby-on-rails ruby sinatra


【解决方案1】:

只需将 .js 添加到您传递 erb() 的符号末尾。啦啦(调用 mypage.js.erb):

erb "mypage.js".to_sym

很脏,但它可以工作。

【讨论】:

  • 对于那些尝试使用 Padrino 的人来说,以下对我有用:render 'user/someview.js',其中someview 位于user 文件夹中,扩展名为.js.erb
【解决方案2】:

根据您的描述,我猜您希望通过 AJAX 编辑和替换页面的某些部分。如果这是错误的,请澄清。

我在我的 Sinatra 应用程序中通过包含(我自己的)AJAXFetch jQuery library 并编写如下所示的代码来执行此操作。这让我在最初渲染页面时以及通过 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

routes/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

【讨论】:

    【解决方案3】:

    sinatra 并不是一个完整的堆栈框架。它应该让你很快上路。您可以单独使用 erb,然后加载到您的 sinatra 代码中。

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 2021-10-06
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 2022-07-14
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      相关资源
      最近更新 更多