【问题标题】:slim tries to render template from wrong pathslim 尝试从错误的路径渲染模板
【发布时间】:2014-02-16 14:12:04
【问题描述】:

我是 ruby​​ 世界的新手,而 Sinatra 也是如此,所以我别无选择,只能在这里询问我不断遇到的错误。

我使用 Rack + Sinatra 和 Slim 作为模板引擎的组合。我的app.rb 设置如下:

module Pulsr

class StylusHandler < Sinatra::Base
  set :views, File.dirname(__FILE__) + '/stylus'

  get '/css/styles.css' do
    stylus :styles
  end
end

class Application < Sinatra::Base

  register Sinatra::ConfigFile

  config_file './config/config.yml'

  use Pulsr::Api
  use Pulsr::Routes

  enable :logging, :dump_errors if Sinatra::Base.development?
  disable :method_override, :run

  set :public_folder, File.join(:root.to_s, 'static')
  set :views, File.join(:root.to_s, 'views')
  #set :static_cache_control, [:public, max_age: 60 * 60 * 24 * 365] if Sinatra::Base.production?

end

结束

Pulsr::ApiPulsr::Routes 位于子目录中的两个不同文件中。我遇到的问题是 slim 尝试相对于路由文件的路径渲染模板,如下所示:

module Pulsr
class Routes < Sinatra::Base
  get '/*' do
    slim :index
  end
end

结束

所以,我的文件夹结构如下所示:

- config
  - config.yml
  ...
- controllers
  - routes.rb
- views
  - index.slim
- app.rb
- config.ru
- Gemfile
...

我收到此错误:No such file or directory @ rb_sysopen - /Users/rolandjitsu/Projects/Products/pulsr/controllers/views/index.slim 模板实际放置在views 文件夹中的上一级。

在我拥有 app.rb 文件中的所有代码之前,它通常可以工作,但现在我不确定如何解决此路径问题。

【问题讨论】:

    标签: ruby sinatra slim-lang


    【解决方案1】:

    您已将您的Routes 类设置为与您的主应用程序不同的 Sinatra 应用程序,这意味着它有自己的不共享设置。因此Routes 应用程序的views 文件夹是该应用程序的默认,即controllers 目录中的views 目录。

    解决此问题的简单方法是在 Routes 类中指定 views 目录。

    module Pulsr
      class Routes < Sinatra::Base
    
        # add this line
        set :views, File.expand_path(File.join(__FILE__, '../../views'))
    
        get '/*' do
          slim :index
        end
    end
    

    您也可以将app_file设置为主应用文件,viewsrootpublic_folder设置都将基于此设置。

    看起来您实际上并不打算创建多个单独的应用程序,而是将您的单个应用程序拆分为多个文件。一个可能更好的方法是使用extensions。您可以创建一个包含路由的模块,这些路由可以包含在主应用程序中,它们将使用与主应用程序相同的设置。

    module Routes # N.B modle not class
    
      # in this method you can add routes to the main app
      def self.registered(app)
    
        # you need to use 'app.get', not plain 'get'
        app.get '/*' do
          slim :index
        end
      end
    end
    

    然后在您的主应用程序中调用 register Routes 而不是 use Routes。这需要更多的设置工作,但为您提供了更大的灵活性。

    【讨论】:

    • 我认为它一定与设置有关,因为我在我的 routes.rb 文件中尝试了类似 set :views, File.expand_path(File.join(__FILE__, '../../views')) 的东西,看起来我遇到了一个新错误,但是关于无法执行的错误解决路径消失了。我想我更喜欢你发布的第二种方式。我拆分文件的原因是因为我正在尝试实现类似于 MVC 的架构。没错,我并没有制作几个单独的应用程序,它只是一个,所有路由都将解析为索引,因为我将使用 angular 来导航页面。
    • @rolandjitsu 我在回答中没有提到的东西:在你的问题中你有set :views, File.join(:root.to_s, 'views'),这是错误的——它会产生root/views。您可能打算使用应用程序根设置。默认是views,所以你根本不需要那行。
    • 是的,我认为:root 会给我我的应用程序路径的根。有没有另一种方法来获取它并附加所需的字符串?确实,我的视图不需要它,但我的静态资产确实需要它,因为它们将位于默认 public one 之外的另一个文件夹中
    • @rolandjitsu 只需使用root(即没有:)。设置可用作类范围内的方法,在您需要使用 settings.root 的路由内。
    • @rolandjitsu 另一种选择是从不同的文件重新打开主应用程序类并向其添加路由等。以其他问题为例:stackoverflow.com/questions/5015471/…
    猜你喜欢
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多