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

babyhai · March 28, 2017 · Last by hging replied at March 29, 2017 · 1801 hits
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 对象,应该会报错啊,为什么你还能跳转

不知道

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

Reply to babyhai

controller 里面 update 方法,第一行

@book = Books.find params[:id]

的注释去掉

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

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

9 Floor has deleted

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

  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

Reply to Garrus

好的 我会试一下的 谢谢

Reply to alixiaomiao

turbolinks 是什么?_?

Reply to hging

传的是 get

Reply to babyhai

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

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

Reply to babyhai

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

Reply to 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,接着点击删除。 看你浏览器发起的请求是什么? 应该是这样的

Reply to tesla_lee

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

Reply to babyhai

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

You need to Sign in before reply, if you don't have an account, please Sign up first.