新手问题 Rails 6.0.1 dropdown 鼠标指上去无法下拉,请前辈们解惑

ChileNeverDie · 2020年01月07日 · 最后由 chile 回复于 2020年01月12日 · 2712 次阅读

最近在跟着 RoR 教程做一个网站,Rails 版本 6.0.1,在 Account 这个文字上设置了 dropdown,但是鼠标指上去以后并没有下拉显示。 如下是在 app/views/layouts/_header.html.rb 里面关于 dropdown 的代码:

<header class="navbar navbar-fixed-top navbar-inverse"> 
  <small>
    <div class="container">
      <%= link_to image_tag("*", alt: "*"), home_path, id: "logo_left" %> 
      <nav> 
        <ul class="nav navbar-nav navbar-right"> 
          <li><%= link_to "Help", help_path %></li>
          <% if logged_in? %>
            <li><%= link_to "Users", '#' %></li>
            <li 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", '#' %></li>
                <li class="divider"></li>
                <li> 
                  <%= link_to "Log out", logout_path, method: :delete %>
                </li>
              </ul>
            </li> 
          <% else %>
            <li><%= link_to "Log in", login_path %></li>
          <% end %>
        </ul>
      </nav> 
    </div>
  </small>
</header>

我忽然想起来,这个还要在 application.js 中引入 Bootstrap JavaScript 库,但问题是昨天我做的时候,在 app/assets 里没有/javascripts 这个文件夹,更没有 application.js 这个文件。。。于是我从另一个文件夹里拷贝改名了一个文件。。。这个会不会有影响?


问题已解决,见评论 logout 这个功能,我已经在 config/routes.rb 里面指定了

delete '/logout', to: 'sessions#destroy'

直接在链接后增加/logout 显示 No route matches [GET] "/logout" Rails.root: /home/ubuntu/environment/*** 但是他下面却显示有这个 routes

logout 相关代码: app/controllers/session_controller

class SessionsController < ApplicationController
  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password]) 
      log_in user
      redirect_to user
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new' 
    end
  end

  def destroy
    log_out
    redirect_to root_url
  end
end

app/helpers/session_helper

module SessionsHelper
  def log_in(user) 
    session[:user_id] = user.id
  end 

  def current_user
    @current_user ||= User.find_by(id: session[:user_id])
  end

  def logged_in?
    !current_user.nil?
  end

  def log_out
    session.delete(:user_id)
    @current_user = nil
  end
end

请前辈们解惑!

你发起的是 get 请求,但是你路由是 delete

stargwq 回复

额,那请问这个要咋整。。。

路由的作用就是映射,而映射的条件有 2 个。一个是 request method,一个是 url。

你定义的路由是 delete 的 method。

那么首先检查的是你在页面上的那个按钮生成的请求的 method 和 URL 是否是你期望的。检测方式就是点击后查看日志。清空屏幕,保证你这次即将点击生成的 log 没有其他干扰信息。

例如这样

Started GET "/xxx/xxx" for xxx at 2020-01-07 14:14:29 +0800

排查错误就要从 log 里去分析。

这里就说了 method 是 GET,URL 是 /xxx/xxx 然后再去你的路由里检查,是 method 没对,还是 url 没对。

在你目前提供的信息里,至少很明显 method 没对。所以你要检查,为什么那个 link_to 你写了 method 是 delete,点击后它还是 get 请求,是拼写错误吗?还是其他什么原因,这是你需要去查询和解决的了。

Catherine 回复

确实,查了下日志是,输入/logout 后在服务器端跳出来的是 GET 方法,我再研究下

我直接在 routes.rb 里面加了一条 get‘/logout’, 'sessions#destroy',无法 logout 的问题解决了。。。下拉框无法显示的情况仍存在。。。

bootstrap 的 dropdown 依赖 boostrap 提供的 js,delete method 依赖 rails-ujs(创建项目应该就有),检查 js 文件里面是否引入了这两个库,layout 是否引用了 js。

ChileNeverDie 回复

你是为了解决 A 问题,发现有 B 方案。你无法实现 B 方案,就去把 A 问题本身给干掉了。你这样做完全不对啊!

路由定义的是 delete 方式,就是希望你用 delete 方式去命中它。你应该解决是的让 link_to 按钮发送一个 delete 请求,而不是把路由改成 get 请求。

Catherine 回复

理解 QAQ,我再去看看

Catherine 回复

我已经在后面指定了 method 是 delete 了,为啥还是这样啊。。。另外我看 routes.rb 里面的 delete 方法,字体颜色跟 get,post 不一样,似乎没有识别出来?

ChileNeverDie 回复

我之前学习 tutorial 的时候遇到问题不知道怎么解决,我就把那一章全部照着重写,一行行检查哪里不一样。如果想知道哪里写错了,那就改一行运行一下,直到找出哪一行有问题。

因为 tutorial 里的代码我相信它是完全可以运行的。最后发现大多都是自己的一些拼写、文件名、文件引用的问题。

另外在有代码参考的前提下,多复制粘贴,少自己敲。但不是无脑复制粘贴,而是理解它后直接粘贴从而避免拼写问题。

你可以参考下...

Catherine 回复

我看了下,我觉得可能还是没有 boostrap 和 js 的问题。。。导致没法用 delete 请求,但是我项目里面确实没有这个相关的东西。。。

可能你用的是 webpacker,但你仍然在 assets/javascripts 底下写 js

killernova 回复

这个问题在我重新建了一遍站以后解决了。。。现在出现了新的问题

问题已经解决,重新建了个项目,一步步重新走了一遍。似乎是之前有一步我把 JavaScript 文件夹删了,导致没法调用弄出来的问题。。。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号