I'm going through Michael Hartl's Rails Tutorial, now I'm at the Chapter 10 and I cannot understand one thing:
When you delete one Micropost, where is the @micropost
variable in the destroy
method defined?
(I suspect it may be server by the link_to
method, but I'm not sure if that makes sense or not)
<%= 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
(for whose not familiar with the tutorial, the form and the index of the Microposts are in the root_page
, handled by static_pages
)
if there is some code missing, here is the full project:
https://github.com/Salomanuel/Odin_Project-Ruby_on_Rails_Tutorial/tree/13-user-microposts
答案 0 :(得分:1)
Referencing the code here https://github.com/Salomanuel/Odin_Project-Ruby_on_Rails_Tutorial/blob/375b4d7995d54337407f1736df0e7693a9de5ac6/app/controllers/microposts_controller.rb
You see at the top in the controller there is a line
before_action :correct_user, only: :destroy
This line tell rails that call current_user
function before calling :destroy
.
Now see in correct_user
function we are getting id
from params
and declaring the @micropost
variable.
def correct_user
@micropost = current_user.microposts.find_by(id: params[:id])
redirect_to root_url if @micropost.nil?
end
Hope this answer your question. You can read more about callbacks from here http://guides.rubyonrails.org/active_record_callbacks.html.
答案 1 :(得分:0)
ok, while doing some exercises I found out the solution.
Turns out the @micropost
variable was assigned by a private method called by a 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
but still, is this considered good practice?