Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中使用Ajax删除记录_Ruby On Rails_Ajax - Fatal编程技术网

Ruby on rails 在Rails中使用Ajax删除记录

Ruby on rails 在Rails中使用Ajax删除记录,ruby-on-rails,ajax,Ruby On Rails,Ajax,我有一个用户页面,用户可以在其中键入和提交帖子。我使用Ajax允许用户从user/show页面执行此操作。当我试图让用户删除帖子时,我遇到了问题。当用户单击“删除”链接时,文章将从页面中删除。然而,当我重新加载页面时,帖子又回来了。它没有被摧毁 我在不同的上下文中在用户/编辑页面上实现了相同的代码,这很好,因为提交表单时post记录会被销毁。但是,在这种没有提交表单的情况下,我不确定如何使其工作 以下是我的设置: :用户有许多:帖子 :帖子属于\u:user :帖子属于:帖子类型 :post\u

我有一个用户页面,用户可以在其中键入和提交帖子。我使用Ajax允许用户从user/show页面执行此操作。当我试图让用户删除帖子时,我遇到了问题。当用户单击“删除”链接时,文章将从页面中删除。然而,当我重新加载页面时,帖子又回来了。它没有被摧毁

我在不同的上下文中在用户/编辑页面上实现了相同的代码,这很好,因为提交表单时post记录会被销毁。但是,在这种没有提交表单的情况下,我不确定如何使其工作

以下是我的设置:

:用户有许多:帖子

:帖子属于\u:user

:帖子属于:帖子类型

:post\u类型有许多:post

用户#显示:
这是用户提交帖子的代码。这很好用

<% if logged_in? && current_user == @user %>
  <% form_tag(:controller => "posts", :action => "create") do %>
    <div><%= text_area_tag(:message, nil, :size => "27x3") %></div>
    <div><%= submit_tag("Post") %></div>
    <div><%= label_tag(:post_type_id, "Update type?", :class => 'typeLabel') %></div>
    <div><%= collection_select(@posts, :post_type_id, PostType.all, :id, :name) %></div>
  <% end %>
<% end %>
如果有任何其他信息会有所帮助,请告诉我。谢谢

更新2 我尝试使用
link\u to\u remote
,如下所述。我同意这是正确的解决方案,但无法让它工作。我想是因为路线问题

我将帖子设置为如下用户资源:

map.resources :users, :member => { :enable => :put } do |users|
  users.resources :posts
end  
<%= link_to_remote "- Delete Post", :url => user_post_url(@user,c), :method => :delete, :confirm => "Are you sure you want to permanently delete this post?", :success => "$(this).up('.postS').remove();" %>  
当我实现答案中提供的
link\u to\u remote
代码时,我得到一个“no method error”异常,如下所示:
undefined method
post\u url'for#`

我尝试了一些可以解释这一点的调整,但没有一次成功。有什么想法吗?这与我的路线有关,对吗

更新 Rails指南中的代码不起作用。我也尝试了许多变化

我得到的最接近的结果是:

<%= link_to_remote "- Delete Post", :url => { :controller => 'posts', :action => 'destroy', :id => @user.posts, :method => :delete }, :confirm => "Are you sure you want to permanetly delete this post?", :success => "$(this).up('.postS').remove();" %>  
注意id=>“12/11”。这不是我想要的

当我将id参数更改为:id=>@user.post时,我得到一个“无方法错误”。未定义的方法'post'用于#user:0x3ddc20c

当我尝试
:id=>user\u post\u url(@user,@post)
时,我得到:
“user\u post\u url
无法从中生成[然后它列出了此用户的所有数据库列值]

当我尝试
:id=>user\u posts\u url(@user,@posts)
时,页面会被加载。当我单击删除链接时,系统会提示我接受。然后什么都不会发生。当我重新加载页面时,该帖子仍然存在,并且从未从数据库中删除

这是我能想到的每一种变化。有什么想法吗

更新3 这就是我的路线:

    user_posts GET    /users/:user_id/posts(.:format)          {:controller=>"posts", :action=>"index"}
               POST   /users/:user_id/posts(.:format)          {:controller=>"posts", :action=>"create"}
 new_user_post GET    /users/:user_id/posts/new(.:format)      {:controller=>"posts", :action=>"new"}
edit_user_post GET    /users/:user_id/posts/:id/edit(.:format) {:controller=>"posts", :action=>"edit"}
     user_post GET    /users/:user_id/posts/:id(.:format)      {:controller=>"posts", :action=>"show"}
               PUT    /users/:user_id/posts/:id(.:format)      {:controller=>"posts", :action=>"update"}
               DELETE /users/:user_id/posts/:id(.:format)      {:controller=>"posts", :action=>"destroy"}
更新4 根据下面ScottD的指导,我的代码如下所示:

map.resources :users, :member => { :enable => :put } do |users|
  users.resources :posts
end  
<%= link_to_remote "- Delete Post", :url => user_post_url(@user,c), :method => :delete, :confirm => "Are you sure you want to permanently delete this post?", :success => "$(this).up('.postS').remove();" %>  
对我来说,这一切看起来都很好。所以我不确定为什么javascript删除不起作用

当我重新加载页面时,日志会显示正常加载的所有内容,帖子也会消失(应该是这样的)。关于如何让javascript删除工作正常进行,有什么想法吗

更新#5 以下是基于我正在使用的
link\u to\u remote
代码,当前在html中生成的内容:

<a href="#" onclick="if (confirm('Are you sure you want to permanently delete this post?')) { new Ajax.Request('http://localhost:3000/users/1/posts/18', {asynchronous:true, evalScripts:true, method:'delete', onComplete:function(request){$(this).up('.postS').remove();}, parameters:'authenticity_token=' + encodeURIComponent('ccF1QNCGs9IlvbIYWwmQmcbi7kROgQsTZjM1dM687xA=')}); }; return false;">- Delete Post</a>  

问题是,您使用的是只调用Javascript函数的
link\u to\u函数
,它不会向您的应用程序发布任何内容。如果您想使用Ajax,请尝试
link\u to\u remote
。这将进行Ajax调用,然后它允许您基于回调挂钩调用Javascript,如
:success
:complete

基于您的示例的示例:

<% if logged_in? && current_user == @user %>
  <%= link_to_remote "- Delete Post", :url => user_post_url(@user,c, :format => :json), :method => :delete  , :confirm => "Are you sure you want to permanetly delete this post?", :success => "$(this).up('.postS').remove();" %>                                                      
<% end %> 

已更新以反映相关的嵌套路由。

如果有帮助,我现在在应用程序中遇到了类似的问题,直到现在,我一直跟踪到这样一个事实,除了

:success => "$(this).up('.postS').remove();"
链接到远程的一部分没有按想象的方式工作。由于某些原因,它在DOM中找不到正确的div


我并不是说这是你的问题,但这可能会让你走上正轨。

OP需要了解的重要一点是,OP的方法仅从用户计算机上的浏览器中删除帖子,而不是从服务器上的数据库中删除帖子。谢谢。这是有道理的,但我在实现时遇到了一些问题。我想我知道为什么,但无法使其工作。请参阅原始问题中的更新。谢谢。我尝试了许多实现,但仍然没有完全实现。我更新了问题以解释我尝试执行的操作。对发生的事情有何想法?我认为可能是控制器问题?我是否需要在posts控制器的销毁方法中包含一些与此无关的内容ere?感谢Scott的更新。我认为这是控制器的问题,但无法使其工作。Json的内容超出了我的想象。我需要一段时间才能弄清楚如何使其工作。因为您使用的是嵌套资源,所以您的url看起来更像user_post_url(@user,@post)。查看Rails嵌套资源文档。此外,您可以从Rails_ROOT在命令行上运行rake routes以打印出所有路由。查看上面的代码,我看到您在用户帖子中循环,并在帖子中设置一个名为“c”的变量。因此,在url中,您需要执行user_post_url(@user,c)谢谢,斯科特。这几乎让我达到了目的。我实施了你的指导,并在问题中添加了一个更新,试图隔离最后一个问题。有什么想法吗?
POST http://localhost:3000/users/1/posts/18  302 Moved Temporarily  
GET  http://localhost:3000/users/1 200 OK
<% if logged_in? && current_user == @user %>
  <%= link_to_remote "- Delete Post", :url => user_post_url(@user,c, :format => :json), :method => :delete  , :confirm => "Are you sure you want to permanetly delete this post?", :success => "$(this).up('.postS').remove();" %>                                                      
<% end %> 
def destroy
  @post = Post.find(params[:id])
  respond_to do |format|
    if @post.destroy
      format.html { redirect_to :back }
      format.json { :success => true }.as_json
    else
      flash[:notice] = "Post failed to delete."
      format.html { redirect_to :back }
      format.json { :success => false }.as_json
    end
  end
end
:success => "$(this).up('.postS').remove();"