【问题标题】:Deleting records using forms in rails 3.2在 Rails 3.2 中使用表单删除记录
【发布时间】:2013-06-19 17:21:12
【问题描述】:

我有两个模型,用户和材料。用户可以喜欢的材料。我已经建立了关系并且收藏代码工作正常,但我似乎无法正确获取取消收藏的代码。我有以下不喜欢的代码:

材料控制员(在不喜欢的形式出现的情况下显示动作)

@favourite = Favmat.where(:user_id => current_user.id, :material_id => @material.id)

注意:我使用此代码来决定在视图中显示哪个按钮。假设存在记录,我们得到:

查看

<%= form_for @favourite, :method => :delete do |f| %>
<%= f.submit "Unfavourite" %>
<% end %>

问题似乎在这里。我所做的任何事情似乎都没有让我找到在 favmats 控制器中进行销毁操作的有效途径。我尝试使用 form_tag 代替,但后来我得到了非常奇怪的路线,这些路线不起作用。

Favmats 控制器

def destroy
  Favmat.find(params[:id]).destroy
  respond_to do |format|
    format.html { redirect_to @material }
    format.js
  end
end

更新

我也尝试过使用 link_to 而不是表单。代码如下:

<%= link_to "Unfavourite", favmat_path, method: "delete" %>

奇怪的是,用于此的 html 从材料中获取 favmat id,而不是 favmat 对象。我不知道如何在其中获取 favmat 对象 ID。似乎没有任何效果。

【问题讨论】:

  • 您是否收到错误消息?如果我站在你的立场上,我会在 materials_controller 中处理“不喜欢”作为会员操作。
  • 我确实收到了错误,是的。我曾考虑在材料控制器中处理不受欢迎的问题,但它已经很胖了,在 Favmats 控制器中与 Favmats 模型相关的操作似乎更有意义。
  • 您遇到什么错误?你能粘贴所有的回溯吗?是不是undefined method model_name...

标签: ruby-on-rails ruby-on-rails-3.2 form-for destroy delete-record


【解决方案1】:

尝试将@favourite 对象而不是favmat_path 传递给link_to

<%= link_to "Unfavourite", @favourite, method: :delete %>

【讨论】:

  • 我得到:ActiveRecord::Relation:Class 的未定义方法 `model_name'
  • @Finnjon 尝试将@favourite = Favmat.where(:user_id =&gt; current_user.id, :material_id =&gt; @material.id) 替换为@favourite = Favmat.where(:user_id =&gt; current_user.id, :material_id =&gt; @material.id).first
  • 谢谢,这行得通!但是,当只返回一条记录(因为每条记录都是唯一的)时,为什么它需要“第一条”呢?
  • @Finnjon 因为where 总是返回一个关系,即使它只保存一条记录。 where 将单记录关系转换为记录并不是那么聪明,因此您必须手动进行。顺便说一句,请考虑将有用的答案标记为已接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多