本地预编译资产破坏了我的应用程序

时间:2012-11-09 08:00:00

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

我是Michael Hartl教程之后的新手程序员。

我即将完成第9章,它增加了查看网站上所有用户的功能,并删除了具有管理功能的个人。

所有规格都在传递,一切都按预期在本地运行。但是,当我在Heroku测试该站点时,用户的索引看起来与本地索引不同。

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

No route matches [GET] "/signout"

我的所有规格仍在传递,这对我来说只是一个谜!我怀疑这是资产如何编译的问题,但作为一个铁杆新手,感觉就像在大海捞针寻找,所以任何帮助都是受欢迎的。

的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>

的application.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>

3 个答案:

答案 0 :(得分:1)

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

这可能是因为缺少javascript库,你能检查一下是否丢失了吗?

答案 1 :(得分:0)

使用此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

答案 2 :(得分:0)

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

首先,我删除了public/assets文件夹,这使得Heroku可以进行编译。

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

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