Michael Hartl的Rails教程第10章破坏方法

时间:2013-07-09 07:32:29

标签: ruby-on-rails

我有一个概念性的问题。我目前正在研究Micahel Hartl着名的Rails教程(http://ruby.railstutorial.org/),我已经到了第10章(woot!)。作为一个背景,正在创建微博,并正在实施类似Twitter的状态订阅源。创建微博时,它将显示在主页状态订阅源和配置文件页面中。我的问题来自微博和feed_item对象之间的关系。在本教程中,可以通过用户的个人资料或主页的源删除微博。根据用户的个人资料或主页的提要,微博被删除不同的部分。以下是部分内容:

对于个人资料页面:

  <% if current_user?(micropost.user) %>
    <%= link_to "delete", micropost, method: :delete,
                                     data: { confirm: "You sure?" },
                                     title: micropost.content %>

对于主页状态Feed:

<li id="<%= feed_item.id %>">

  <span class="user">
    <%= link_to feed_item.user.name, feed_item.user %>
  </span>
  <span class="content"><%= feed_item.content %></span>
  <span class="timestamp">
    Posted <%= time_ago_in_words(feed_item.created_at) %> ago.
  </span>
    <% if current_user?(feed_item.user) %>
    <%= link_to "delete", feed_item, method: :delete,
                                     data: { confirm: "You sure?" },
                                     title: feed_item.content %>
  <% end %>
</li> 

以下是控制器,视图和模型:

class StaticPagesController < ApplicationController
  def home
    if signed_in?
      @micropost  = current_user.microposts.build
      @feed_items = current_user.feed.paginate(page: params[:page])
    end
  end

end

class User < ActiveRecord::Base
...
has_many :microposts,  dependent: :destroy
....
  def feed
    Micropost.where("user_id = ?", id)
  end
...
end

    class MicropostsController < ApplicationController
    before_action :signed_in_user, only: [:create, :destroy]
    before_action :correct_user,   only: :destroy
..

     def destroy
            @micropost.destroy
            redirect_to root_url
          end

...
    end

我认为从主页状态提要中删除的微博是通过Microposts Controller的destroy方法发生的,但我不确定如何。我在主页状态提示中看到link_to的删除按钮具有删除方法,但它会转到feed_item网址。这个feed_item网址来自哪里?我假设link_to知道以某种方式删除微博,因为Feed的原始来源来自用户模型中的微博数组,但是如何知道通过点击feed_item url转到Micropost的控制器销毁方法? link_to“title:feed_item.content”是否与feed_item有关,知道要删除哪个微博?如果有人能帮我理解微博,feed_item和destroy方法之间的关系,我将非常感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我可以用DELETE方法帮助你,实际上很容易:大多数浏览器都不支持PATCH,PUT和&amp;删除所以Rails通过参数“_method”并在内部转换来欺骗。这就是为什么你把它视为GET,直到它击中Rails内部。

您可以在这里阅读更多内容: http://guides.rubyonrails.org/form_helpers.html#how-do-forms-with-patch-put-or-delete-methods-work-questionmark

HTH