新手问题 在 index 页面定义了删除的请求方式 ,但是日志还是走的 get 请求 找不到原因请小伙伴帮帮忙

babyhai · 2017年03月28日 · 最后由 hging 回复于 2017年03月29日 · 1816 次阅读
ruby版本:  2.4 
rails版本:  5.0
apache 版本:  2.4.6

这是我的路由文件:

Rails.application.routes.draw do
  resources :books
end

这是 books_controller.rb

class BooksController < ApplicationController
  def index
    @books = Book.all
  end

  def new
    puts "=== params:"
    puts params.inspect
  end

  def create
    Book.create :title => params[:title],
      :author => params[:author]
    redirect_to books_path
  end

  def edit
    @book = Book.find params[:id]
  end

  def update
    #@book = Book.find params[:id]
    #@book.title = params[:title]
   # @book.author = params[:author]
    #@book.save
    @book.update params[:book]
    redirect_to books_path

  end

  def show
    @book = Book.find params[:id]
  end


  def destroy
    puts "=== params:"
    puts params.inspect
    @book = Book.find params[:id]
    @book.delete
    redirect_to books_path
  end

  private
  def get_by_id
    @book = Book.find params[:id]
  end
end

这是 index 列表页面:

<h3> Book 列表页</h3>

<table>
  <tr>
    <td>标题</td>
    <td>作者</td>
    <td>操作</td>
  <tr>
<% @books.each do |book| %>
  <tr>
    <td><%=link_to  book.title, book %></td>
    <td><%= book.author %></td>
    <td>
    <%= link_to "编辑", edit_book_path(:id => book.id) %>
      <%= link_to "删除", book, :method => :delete %>
    </td>
  </tr>
<%end %>

<%= link_to "新建", new_book_path %>

这是编辑页 edit

<h3>编辑页 </h3>

<%=  form_for @book do |f| %>
    标题: <%= f.text_field :title %><br/>
    作者: <%= f.text_field :author %><br/>
    <%= f.submit %>
<% end %>

这是我的详情页 show

<h3>详情页</h3><br/>

书名: <%= @book.title %><br/>
作者: <%= @book.author %><br/>

<%= link_to '列表页', books_path %>

然后 我说一下我遇到的问题,第一个就是再 index 页面 点击删除 它会自己跳转到详情页 然后我的 books controller 里面 destroy 里面打印了 params 接受的参数 可是日志里面没有打印什么接受到的参数 在新建页 可以打印 params 接受的参数

还有一个问题,我是看着视频跟着一步一步操作的,在编辑页 修改了作者的名字,然后提交了 回到列表页 显示 /book/4 我回到数据库中查看发现 这个 作者 跟书名 全部没有了

你的 update 方法,都没有取得 book 对象,应该会报错啊,为什么你还能跳转

这个问题 是什么原因我都不清楚

babyhai 回复

controller 里面 update 方法,第一行

@book = Books.find params[:id]

的注释去掉

注释去掉了 但又加上了 现在编辑 功能又没有问题了好奇怪

我在群里问了别人,有人 说是我的 js 文件没有引用才导致 写的 delete 请求 变成 get 请求 也有说是因为 apache 服务器的原因

9 楼 已删除

你在帖子里再增加下面这些信息吧。

  1. 你用的环境,windows or linux or mac
  2. ruby 和 rails 版本
  3. 什么服务器,版本是什么?
  4. 再贴一下你的服务器日志。

用的是 centos 虚拟机 ruby:2.4 rails:5.0.2 用的 apache 服务器 版本是 2.4.6

这事 按 F12 里面的代码 删除 写的 delete 的请求方式

这个是我点击删除后的日志文件

开控制台 看看前端到底传的是什么命令 如果传的是 get 就是 js 加载问题 如果传的是 delete 就是 apache 配置的问题

挺想知道你说的“我是看着视频跟着一步一步操作的”的视频是?

你群里那个人说的是对的,你没开turbolinks,jQuery_ujs,delete 请求变成了 get,action 变成了 show 而不是 destroy。

在你的 application.js 中加入 //= require jquery_ujs

Garrus 回复

好的 我会试一下的 谢谢

alixiaomiao 回复

turbolinks 是什么?_?

hging 回复

传的是 get

babyhai 回复

这是我的 application.js 文件 里面有这句呢??

视频是朋友给我的 他也是学 ruby 的

babyhai 回复

你的 layout 有没有加上 <%= javascript_include_tag 'application' %>

babyhai 回复

没有加载 application.js 你在里面 require 有什么用。。。。赶紧加上

刚刚没看清楚 你看看 application.html.erb

现在问题有点难以定位,现在确定的是

  1. 你生成的 HTML 代码是正确的
  2. 接下来要确定的是你浏览器发起的请求是不是正确的?
  3. 如果请求是正确的,那就是你的服务器的问题。

资料: Rails API 里是这么说实现 link delete操作的。

Useful for having links perform a POST operation in dangerous actions like deleting a record (which search bots can follow while spidering your site)

Rails 是通过 POST 来实现 delete 操作的。 在我的浏览器 Chrome 里,delete 操作是这样的

POST 请求
url: /posts/1
form Data:
  _method: delete
  authenticity_token: xxxxxxx

所以,需要你给下面这个信息,在 Chrome里,按F12,点击 Network,然后勾选Preserve log,接着点击删除。 看你浏览器发起的请求是什么? 应该是这样的

tesla_lee 回复

是这样的 我今天代码没有动,换了一个虚拟机 这个虚拟机的服务器是 rails 内置的服务器 开了以后 删除没有任何问题 apache 服务器的那个 我按 F12 里面的代码是 delete 请求 但是执行的日志里面是 get 请求的

babyhai 回复

那就是 apache 服务器的问题 检查下配置

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