【问题标题】:Rails Member Route Breaks Layout in Rails 5.1Rails 5.1 中的 Rails 成员路由中断布局
【发布时间】:2018-02-09 15:41:40
【问题描述】:

我有一个名为“claims”的 Rails 控制器和一个名为“addservice”的操作。 如下图

class ClaimsController < ApplicationController
  before_action :set_claim, only: [:show, :edit, :update, :destroy]

  layout 'dashboard'

  def addservice
  end

  def new
  end
end

然后在我的 route.rb 文件中,我有以下路线

resources :claims do 
  member do 
    get 'addService'
  end 
end 

但问题是每当我访问addservice 路由时

localhost:3000/claims/1/addservice

例如,我的仪表板布局中的静态资产链接中断。从终端我看到资产链接现在被命名为如下所示,在实际位置之前添加了一个新的“声明”目录,导致静态文件的链接中断。

ActionController::RoutingError (No route matches [GET] "/claims/asset/plugins/style/css/style.css"):

当我访问声明控制器和其他控制器中的新操作时,它可以正常工作,但对于命名空间路由却没有。

我的dashboard.html.erb布局文件中的链接如下所示:

<link href="../asset/plugins/style/css/style.css" rel="stylesheet">
<link href="../asset/plugins/css/bootstrap-extension.css" rel="stylesheet">      

等等。

【问题讨论】:

    标签: ruby-on-rails actioncontroller ruby-on-rails-5


    【解决方案1】:

    您必须从仪表板布局文件中删除这些样式表

    <link href="../asset/plugins/style/css/style.css" rel="stylesheet">
    <link href="../asset/plugins/css/bootstrap-extension.css" rel="stylesheet">
    

    现在您可以在 app/assets/stylesheets 目录中创建一个新的 css 文件

    # app/assets/stylesheets/dashboard.css
    
    /*
    *= require dashboard/style
    *= require dashboard/bootstrap-extension
    */
    

    现在您可以在 app/assets/stylesheets 目录中创建仪表板目录,并将这些文件放在仪表板目录中。

    现在将仪表板 css 文件添加到资产初始化程序以进行资产预编译

    # config/initializers/assets.rb
    Rails.application.config.assets.precompile += %w( dashboard.css )
    

    将仪表板 css 文件添加到仪表板布局 -

    # app/views/layouts/dashboard.html.erb  
    <%= stylesheet_link_tag 'dashboard', media: 'all'%>
    

    希望它应该工作。

    【讨论】:

    • 我正在使用自定义模板,我需要资产文件和订单保持不变。将它们移动到应用程序样式表文件夹将导致它被压缩,加载样式表的顺序将丢失,弄乱布局。
    • 嗨@skillzAlonge,我根据您的上述评论修改了总答案。请按照答案。
    【解决方案2】:

    使用这个:

    <%= stylesheet_link_tag 'application', media: 'all'%>
    

    并在您的 app/assets/stylesheets/application.css 中要求此资产 在此文件中,您将归档以下文档:

    这是一个清单文件,它将被编译成 application.css,其中将包括下面列出的所有文件。任何 CSS 和 此目录中的 SCSS 文件,lib/assets/stylesheets, 供应商/资产/样式表,或插件的供应商/资产/样式表, 如果有的话,可以在这里使用相对路径来引用。你是 可以免费向该文件添加应用程序范围的样式,它们将出现在 已编译文件的底部,因此您在此处添加的样式采用 优先于其他定义的任何样式中定义的样式 此目录中的 CSS/SCSS 文件。通常最好创建一个 每个样式范围的新文件。

    您的问题是在这里使用相对路径是行不通的。

    【讨论】:

    • 我需要一种方法来将资产静态声明在布局文件中
    • 我的主要挑战是摆脱为命名空间路由添加的“声明”目录。我有什么办法可以做到这一点?
    • 尝试使用:&lt;%= stylesheet_link_tag 'style/css/style' %&gt;&lt;%= stylesheet_link_tag 'css/bootstrap-extension.css' %&gt;
    猜你喜欢
    • 2011-05-12
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    相关资源
    最近更新 更多