Michael Hartl 的 Rails 教程第 10 章中的 destroy 方法

destroy method on Michael Hartl's Rails Tutorial Chapter 10

我正在阅读 Michael Hartl 的 Rails 教程,现在我在第 10 章,但我无法理解一件事:

删除微博时,destroy方法中的@micropost变量在哪里定义?
(我怀疑可能是link_to方式的服务器,但我不确定这是否有意义)

查看:

<%= link_to "delete", micropost, method: :delete, data: { confirm: "You sure?" } %>

微博负责人:

def create
    @micropost = current_user.microposts.build(micropost_params)
    if @micropost.save
        redirect_to root_url
    else
        @feed_items = []
        render 'static_pages/home'
    end
end

def destroy
    @micropost.destroy
    redirect_to request.referrer || root_url
end

静态页面控制器:

  def home
      if logged_in?
          @micropost  = current_user.microposts.build
          @feed_items = current_user.feed.paginate(page: params[:page])
      end
end

(不熟悉教程的朋友,微博的格式和索引在root_page,由static_pages处理)

如果缺少一些代码,这里是完整的项目:
https://github.com/Salomanuel/Odin_Project-Ruby_on_Rails_Tutorial/tree/13-user-microposts

好的,在做一些练习时我找到了解决方案。 原来 @micropost 变量是由 before_action 调用的私有方法分配的:

微博负责人:

before_action :correct_user,        only: :destroy   

private
    def correct_user
        @micropost = current_user.microposts.find_by(id: params[:id])
        redirect_to root_url if @micropost.nil?
    end

但是,这仍然被认为是好的做法吗?

这里引用代码https://github.com/Salomanuel/Odin_Project-Ruby_on_Rails_Tutorial/blob/375b4d7995d54337407f1736df0e7693a9de5ac6/app/controllers/microposts_controller.rb

你看到在控制器的顶部有一条线
before_action :correct_user, only: :destroy

这一行告诉 rails 在调用 :destroy.

之前调用 current_user 函数

现在在 correct_user 函数中看到我们从 params 获取 id 并声明 @micropost 变量。

def correct_user
  @micropost = current_user.microposts.find_by(id: params[:id])
  redirect_to root_url if @micropost.nil?
end

希望这能回答您的问题。您可以从此处 http://guides.rubyonrails.org/active_record_callbacks.html.

阅读有关回调的更多信息