【问题标题】:Precompiling assets locally broke my app在本地预编译资产破坏了我的应用程序
【发布时间】:2012-11-09 08:00:00
【问题描述】:

我是遵循 Michael Hartl 教程的新手程序员。

我即将完成第 9 章,其中添加了查看站点上所有用户并删除具有管理功能的单个用户的功能。

所有规格均已通过,一切都按预期在本地运行。然而,当我在 Heroku 测试网站时,用户的索引看起来与本地索引不同。

我尝试在推送到 Heroku 之前预编译资产,这解决了问题。但是,现在删除用户的功能不起作用。我没有删除用户,而是转发给了该用户。本地版本也是如此。此外,我注意到单击退出链接返回错误:

No route matches [GET] "/signout"

我所有的规格都还在通过,这只会让我更加神秘!我怀疑这是资产如何编译的问题,但作为一个 Rails 新手,感觉就像大海捞针,所以欢迎任何帮助。

routes.rb

Hooter::Application.routes.draw do

  resources :users
  resources :sessions, only: [:new, :create, :destroy]

  root to: 'static_pages#home'
  match '/help', to: 'static_pages#help'
  match '/about', to: 'static_pages#about'
  match '/contact', to: 'static_pages#contact'
  match '/signup', to: 'users#new'
  match '/signin', to: 'sessions#new'
  match '/signout', to: 'sessions#destroy', via: :delete

user_controller.rb

class UsersController < ApplicationController
  before_filter :signed_in_user, only: [:index, :edit, :update, :destroy]
  before_filter :correct_user, only: [:edit, :update]
  before_filter :admin_user, only: :destroy

  def new
    @user = User.new
  end

  def create
      @user = User.new(params[:user])
      if @user.save
        sign_in @user
        flash[:success] = "Welcome to the hooter App!"
        redirect_to @user
      else
        render 'new'
      end
  end

  def index
    @users = User.paginate(page: params[:page])
  end

  def show
    @user = User.find(params[:id])
  end

  def edit
  end

  def update
    @user = User.find(params[:id])

    if @user.update_attributes(params[:user])
      flash[:success] = "Profile updated"
      sign_in(@user)
      redirect_to @user
    else
      render 'edit'
    end
  end

  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "User destroyed"
    redirect_to users_url
  end

  private

      def signed_in_user
        unless signed_in?
          store_location
          redirect_to signin_url, notice: "Please sign in."
        end
      end

      def correct_user
        @user = User.find(params[:id])
        redirect_to(root_path) unless current_user?(@user)
      end

      def admin_user
        redirect_to(root_path) unless current_user.admin?
      end
end

_header.html.erb

<header class="navbar navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container">
      <%= link_to "hooter", root_path, id: "logo" %>
      <nav>
        <ul class="nav pull-right">
          <li><%= link_to "Home",    root_path %></li>
          <li><%= link_to "Help",    help_path %></li>
            <% if signed_in? %>
                <li><%= link_to "Users", users_path %></li>
                <li id="fat-menu" class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                        Account <b class="caret"></b>
                    </a>
                    <ul class="dropdown-menu">
                        <li><%= link_to "Profile", current_user %></li>
                        <li>
                            <%= link_to "Settings", edit_user_path(current_user) %>
                        </li>
                        <li class="divider"></li>
                        <li>
                        <%= link_to "Sign out", signout_path, method: "delete" %>
                        </li>
                    </ul>
                </li>
            <% else %>
                <li><%= link_to "Sign in", signin_path %></li>
            <% end %>
        </ul>
      </nav>
    </div>
  </div>
</header>

应用程序.js

//= require jquery_ujs
//= require jquery
//= require bootstrap
//= require_tree .

application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>
    <%= stylesheet_link_tag    "application", media: "all" %>
    <%= javascript_include_tag "application" %>
    <%= csrf_meta_tags %>
    <%= render 'layouts/shim' %>    
  </head>
  <body>
    <%= render 'layouts/header' %>
    <div class="container">
          <% flash.each do |key, value| %>
            <div class="alert alert-<%= key %>"><%= value %></div>
          <% end %>
          <%= yield %>
          <%= render 'layouts/footer' %>
          <%= debug(params) if Rails.env.development? %>
        </div>
  </body>
</html>

【问题讨论】:

  • jquery_ujs 没有按照我的猜测进行
  • //= 要求 jquery_ujs 存在于 application.js 中?
  • 您是否禁用了javascript?您发送的是用于注销的获取,而不是依赖于 javascript 的删除。
  • 否则,只需删除 /public/assets 文件夹,如果您确信是预编译造成的。
  • @Amar '//= 需要 jquery_ujs' 存在于 application.js 中

标签: ruby-on-rails asset-pipeline precompile


【解决方案1】:

这个问题No route matches [GET] "/signout" 是相关的,因为你实际上不接受/signout 上的GET 请求,根据你的路由定义,它应该是DELETE 动词。

这可能是因为缺少 javascript 库,您能检查一下是否缺少一些吗?

【讨论】:

  • 这帮助我理解了错误,谢谢。我刚刚将 application.js 发布到我的问题中。在我的 app/assets/javascripts 文件夹中,我有 application.js、sessions.js.coffee、static_pages.js.coffee 和 users.js.coffee
  • 看起来所有需要的库都包含在您的 application.js 中,现在它们已加载到 HTML 中:您的模板中的 &lt;head&gt; 标记中是否有 &lt;%= javascript_include_tag :defaults %&gt; 代码?
  • 我的&lt;head&gt;tag 中写着&lt;%= javascript_include_tag "application" %&gt;,我相信这是教程推荐的内容。
  • 您是否看到 HTML 要求您页面的 HTML 源代码中包含 application.js 中包含的所有库?您可以从浏览器访问所有这些 JS 文件吗?
  • 我不确定如何测试我是否可以在浏览器中访问 JS 文件?但是,用:defaults 替换"application" 不起作用。如果您想查看该网站,请访问 twitterforstudyspot.herokuapp.com
【解决方案2】:

使用这个application.js 文件并尝试一下

application.js

//= require jquery
//= require jquery_ujs
//= require_tree .

在您正在阅读的书中,请参阅Listing 8.25.

来源http://ruby.railstutorial.org/book/ruby-on-rails-tutorial?version=3.2#sec-signin_upon_signup

【讨论】:

  • 我刚刚将 application.js 添加到我的问题中。一切似乎都在那里?
【解决方案3】:

在评论者和局外人的帮助下,我设法解决了这个问题。

首先我删除了public/assets 文件夹,它使Heroku 能够进行编译。

然后我将//= require bootstrap 移动到我的jquery 导入下面:

//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require_tree .

【讨论】:

    猜你喜欢
    • 2012-01-02
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    相关资源
    最近更新 更多