1

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

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

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

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

No route matches [GET] "/signout"

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

路线.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

用户控制器.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 .

应用程序.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>
4

3 回答 3

1

这个问题No route matches [GET] "/signout"是相关的,因为您实际上不接受GET请求 on /signout,从您的路线定义来看,它应该是DELETE动词。

这可能是由于缺少 javascript 库而发生的,您能检查一下是否缺少一些吗?

于 2012-11-09T08:08:13.580 回答
0

使用此application.js文件并尝试

应用程序.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

于 2012-11-09T08:09:47.590 回答
0

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

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

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

//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require_tree .
于 2012-11-15T21:25:58.620 回答