0

我有一个概念性的 Rails 问题。我目前正在研究 Micahel Hartl 著名的 Rails 教程(http://ruby.railstutorial.org/),我已经读到第 10 章了(哇!)。作为背景知识,正在创建微博并正在实施类似推特的状态提要。创建微博后,它会显示在主页状态提要和个人资料页面中。我的问题来自 microposts 和 feed_item 对象之间的关系。在本教程中,可以通过用户的个人资料或主页的提要删除微博。问题是微博通过不同的部分被删除,具体取决于它是用户的个人资料还是主页的提要。以下是部分内容:

对于个人资料页面:

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

对于主页状态提要:

<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

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

4

1 回答 1

0

我可以用 DELETE 方法帮助你,事实上这很容易:大多数浏览器不支持方法 PATCH、PUT 和 DELETE,所以 Rails 通过传递参数“_method”并在内部转换它来作弊。这就是为什么您将其视为 GET,直到它遇到 Rails 内部。

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

高温高压

于 2013-07-09T07:56:35.393 回答