Ruby on rails 如何从视图中的按钮调用自定义方法来删除与对象关联的文件?Rails应用程序
我正在开发一个rails应用程序,用户可以发布带有标题、url和上传图像文件的链接。当显示此链接时,我希望在图像旁边有一个删除图片按钮,以便用户可以单击该按钮删除图像 我不知道哪种方法最好,但以下是我所做的:- links_controller.rb中的自定义方法:-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
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
,所以它们必须匹配。修补程序可用于指定对特定资源的修改。也许会有帮助。