I am able to delete the links that are assigned to each user, unless they are voted upon. If a link has any votes on it the delete method being called no longer works.
This is the error I am getting.
undefined method `name' for nil:NilClass
Extracted source (around line #59):
# DELETE /links/1.json
def destroy
@link.destroy
respond_to do |format|
format.html { redirect_to links_url, notice: 'Link was successfully destroyed.' }
format.json { head :no_content }
Rails.root: /Users/ipbyrne/FirstRailsApp/raddit
Application Trace | Framework Trace | Full Trace app/controllers/links_controller.rb:59:in `destroy' Request
Parameters:
{"_method"=>"delete",
"authenticity_token"=>"3JyyNGNPHhdVcQ7tZQ64t+ouQjiNFnwxQXw25fgJGX4=",
"id"=>"5"}
The first block below is my show.html.erb where the destroy method is being called from
The second block is my links_controller.rb file.
<div class="page-header">
<h1><a href="<%= @link.url %>"><%= @link.title %></a><br> <small>Submitted by <%= @link.user.name %></small></h1>
</div>
<div class="btn-group">
<%= link_to 'Visit URL', @link.url, class: "btn btn-primary" %>
</div>
<div class="btn-group pull-right">
<%= link_to like_link_path(@link), method: :put, class: "btn btn-default btn-sm" do %>
<span class="glyphicon glyphicon-chevron-up"></span>
Upvote
<%= @link.get_upvotes.size %>
<% end %>
<%= link_to dislike_link_path(@link), method: :put, class: "btn btn-default btn-sm" do %>
<span class="glyphicon glyphicon-chevron-down">
Downvote
<%= @link.get_downvotes.size %>
<% end %>
</div>
<% if @link.user == current_user -%>
<div class="btn-group">
<%= link_to 'Edit', edit_link_path(@link), class: "btn btn-default" %>
<%= link_to 'Destroy', @link, method: :delete, data: { confirm: 'Are you sure?' }, class: "btn btn-default" %>
</div>
<% end %>
<h3 class="comments_title">
<%= @link.comments.count %> Comments
</h3>
<div id="comments">
<%= render :partial => @link.comments %>
</div>
<%= simple_form_for [@link, Comment.new] do |f| %>
<div class="field">
<%= f.text_area :body, class: "form-control" %>
</div>
<br>
<%= f.submit "Add Comment", class: "btn btn-primary" %>
<% end %>
class LinksController < ApplicationController
before_action :set_link, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, except: [:index, :show]
before_action :authorized_user, only: [:edit, :update, :destroy]
# GET /links
# GET /links.json
def index
@links = Link.all
end
# GET /links/1
# GET /links/1.json
def show
end
# GET /links/new
def new
@link = current_user.links.build
end
# GET /links/1/edit
def edit
end
# POST /links
# POST /links.json
def create
@link = current_user.links.build(link_params)
respond_to do |format|
if @link.save
format.html { redirect_to @link, notice: 'Link was successfully created.' }
format.json { render :show, status: :created, location: @link }
else
format.html { render :new }
format.json { render json: @link.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /links/1
# PATCH/PUT /links/1.json
def update
respond_to do |format|
if @link.update(link_params)
format.html { redirect_to @link, notice: 'Link was successfully updated.' }
format.json { render :show, status: :ok, location: @link }
else
format.html { render :edit }
format.json { render json: @link.errors, status: :unprocessable_entity }
end
end
end
# DELETE /links/1
# DELETE /links/1.json
def destroy
@link.destroy
respond_to do |format|
format.html { redirect_to links_url, notice: 'Link was successfully destroyed.' }
format.json { head :no_content }
end
end
def upvote
@link = Link.find(params[:id])
@link.upvote_by current_user
redirect_to :back
end
def downvote
@link = Link.find(params[:id])
@link.downvote_from current_user
redirect_to :back
end
private
# Use callbacks to share common setup or constraints between actions.
def set_link
@link = Link.find(params[:id])
end
def authorized_user
@link = current_user.links.find_by(id: params[:id])
redirect_to links_path, notice: "Not authorized to edit this link" if @link.nil?
end
# Never trust parameters from the scary internet, only allow the white list through.
def link_params
params.require(:link).permit(:title, :url)
end
end
Aucun commentaire:
Enregistrer un commentaire