Ruby on rails 如何从视图中的按钮调用自定义方法来删除与对象关联的文件?Rails应用程序

Ruby on rails 如何从视图中的按钮调用自定义方法来删除与对象关联的文件?Rails应用程序,ruby-on-rails,Ruby On Rails,我正在开发一个rails应用程序,用户可以发布带有标题、url和上传图像文件的链接。当显示此链接时,我希望在图像旁边有一个删除图片按钮,以便用户可以单击该按钮删除图像 我不知道哪种方法最好,但以下是我所做的:- links_controller.rb中的自定义方法:- def destroy_picture @link = current_user.links.find_by(id: params[:id]) if @link.picture? && @lin

我正在开发一个rails应用程序,用户可以发布带有标题、url和上传图像文件的链接。当显示此链接时,我希望在图像旁边有一个删除图片按钮,以便用户可以单击该按钮删除图像

我不知道哪种方法最好,但以下是我所做的:-

links_controller.rb中的自定义方法:-

  def destroy_picture
    @link = current_user.links.find_by(id: params[:id])
    if @link.picture? && @link.user==current_user
      new_link = @link.dup
      new_link.picture=nil
      new_link.id = @link.id
      new_link.created_at = @link.created_at
      new_link.updated_at = Time.now
      @link.destroy
      new_link.save
      flash[:success]="Picture deleted successfully"
    end
  end
在视图中调用自定义方法:-

完整文件:-

link_controller.rb

class LinksController < ApplicationController
  before_action :logged_in_user, only: [:new, :create, :edit, :update, :destroy]
  before_action :link_owner, only: [:edit, :update, :destroy]

  def new
    @link = Link.new
  end

  def create
    @link = current_user.links.build(link_params)
    if @link.save
      flash[:success]= "Link submitted successfully"
      redirect_to root_path
    else
      render 'new'
    end
  end

  def edit
    @link = current_user.links.find_by(id: params[:id])
  end

  def update
    @link = current_user.links.find_by(id: params[:id])
    if @link.update_attributes(link_params)
      flash[:success] = "Link successfully edited"
      redirect_to current_user
    else
      flash[:danger] = "Link edit failed"
      render 'edit'
    end
  end

  def destroy
    @link = current_user.links.find_by(id: params[:id])
    @link.destroy
    flash[:success] = "Link successfully deleted"
    redirect_to root_path
  end

  def destroy_picture
    @link = current_user.links.find_by(id: params[:id])
    if @link.picture? && @link.user==current_user
      new_link = @link.dup
      new_link.picture=nil
      new_link.id = @link.id
      new_link.created_at = @link.created_at
      new_link.updated_at = Time.now
      @link.destroy
      new_link.save
      flash[:success]="Picture deleted successfully"
    end
  end

  private

    def link_params
      params.require(:link).permit(:title, :url, :picture)
    end

    def link_owner
      link = Link.find(params[:id])
      user = link.user
      redirect_to current_user unless current_user == user
    end
end
类链接控制器
_link.html.erb:-

<div class="container">
  <li class="row">
    <span class="avatar">
      <%= image_tag link.user.avatar_url(:thumb) if link.user.avatar? %>
    </span>
    <span class="content">
      <b><%= link.title %></b> -
      <a href=<%= link.url %>><%= link.url %></a>
    </span>
    <span class="image">
      <%= image_tag link.picture.url if link.picture? %>
    </span>
    <span class="content">
      <% if link.user==current_user %>
        <%= link_to "Delete Picture", link_path(link),
            method: :destroy_picture,
            class: 'btn btn-xs btn-danger' %>
      <% end %>
    </span>
    <span class="timestamp">
      Posted <%= time_ago_in_words(link.created_at) %>
      ago by <%= link_to link.user.name, user_path(link.user)%>
    </span>
    <span class="content">
      <% if current_user==link.user %>
        <%= link_to "Edit", edit_link_path(link),
            class: 'btn btn-xs btn-primary' %>
        <%= link_to "Delete", link_path(link),
            method: :delete,
            data: {:confirm => "Are you sure?"},
            class: 'btn btn-xs btn-danger' %>
      <% end %>
    </span>
  </li>
</div>

  • - 张贴 以前 “你确定吗?”}, 类别:“btn btn xs btn危险”%>
  • 此部分链接可能出现在主页或用户的个人资料页上

    当前,当我单击“删除图片”按钮时,我得到的
    参数丢失或值为空:link
    。我如何绕过执行该方法


    一般来说,最简单的方法是什么

    用指向销毁此类图片的方法的路由替换指向
    帮助程序的
    链接,并在该方法中使用相应的HTTP动词,即
    删除

    <%= link_to "Delete Picture", destroy_picture_path(link), method: :delete, class: 'btn btn-xs btn-danger' %>
    

    将指向
    帮助程序的
    链接替换为指向销毁此类图片的方法的路由,并在该方法中使用相应的HTTP动词,即
    删除

    <%= link_to "Delete Picture", destroy_picture_path(link), method: :delete, class: 'btn btn-xs btn-danger' %>
    

    您是否可以使用单击删除图片时生成的服务器日志更新问题?还可以共享您的
    routes.rb
    代码。您是否可以使用单击删除图片时生成的服务器日志更新问题?还可以共享您的
    routes.rb
    代码。这很有效。谢谢但我想知道为什么它必须是一个“删除”方法。是因为我在方法定义中调用@link.destroy吗?或者,在路由和指向帮助器的链接中用“补丁”替换“删除”可以实现这一点吗?更简单地说,方法的选择是取决于控制器操作中定义的内容,还是可以是任意的?因为为了删除特定资源,必须使用
    delete
    HTTP动词,默认情况下
    link\u To
    发出
    GET
    请求。另外,因为您的路由必须指定为
    delete
    ,所以它们必须匹配。修补程序可用于指定对特定资源的修改。也许会有帮助,这很有效。谢谢但我想知道为什么它必须是一个“删除”方法。是因为我在方法定义中调用@link.destroy吗?或者,在路由和指向帮助器的链接中用“补丁”替换“删除”可以实现这一点吗?更简单地说,方法的选择是取决于控制器操作中定义的内容,还是可以是任意的?因为为了删除特定资源,必须使用
    delete
    HTTP动词,默认情况下
    link\u To
    发出
    GET
    请求。另外,因为您的路由必须指定为
    delete
    ,所以它们必须匹配。修补程序可用于指定对特定资源的修改。也许会有帮助。