rails link_to帖子到错误的ID - 为什么?

时间:2018-03-29 21:56:25

标签: ruby-on-rails ruby

我希望我的用户能够更改他们拥有的Share上的布尔值,但是我的实现尝试更新了错误的记录。

当我使用Item转到id:7的展示页面时,我的控制器会通过查找Share Share来加载关联的item_id对象设置为7.当我单击HideShow按钮时,我的代码会更新关联的Share的{​​{1}}属性,然后重定向到相同的active Item 1}}。

但是,如果我使用Item转到id:3的展示页面,然后点击相同的按钮,我的代码会重定向到并更新active的{​​{1}}属性} Share代替item_id:7。任何人都可以告诉我为什么会这样吗?

我的分享模式:

item_id:3

我的物品型号:

class Share < ActiveRecord::Base
 belongs_to :user
 belongs_to :item

 def activate
  self.active = true
  save
 end

 def deactivate
  self.active = false
  save
 end
end

在我的 class Item < ActiveRecord::Base has_many :shares end 行动中,我有这个:

ItemsController#show

在我的def show @item = Item.friendly.find(params[:id]) @owned_share = current_user.shares.find_by(item_id: @item.id) end 中,我有这个:

SharesController

在我的项目展示视图中,我有这个:

def activate
 @owned_share = current_user.shares.find_by(params[:item_id])
 @owned_share.activate
 respond_to do |format|
  format.html { redirect_to item_path(@owned_share.item) }
  format.json { render :index, status: :ok, location: @owned_share }
 end
end

def deactivate
 @owned_share = current_user.shares.find_by(params[:item_id])
 @owned_share.deactivate
 respond_to do |format|
  format.html { redirect_to item_path(@owned_share.item) }
  format.json { render :index, status: :ok, location: @owned_share }
 end
end

2 个答案:

答案 0 :(得分:2)

正如评论中所述,您收到的参数不是item_id,而是share_id,这就是为什么尽管您修改了查询添加要查找的属性,但它不是给你预期的结果。

更新用于获取用户分享的参数,例如:

@owned_share = current_user.shares.find_by(item_id: params[:share_id])

虽然在这种情况下不清楚你为什么要使用share_id来查找item_id,但很可能你也可以更新那个部分。

由于这两个操作共享某些特定功能,因此您只需创建一个只更新活动属性“翻转”其值的文件:

# model
def toggle_active
  update(active: !active)
end

# controller
def update_active_status
  @owned_share = current_user.shares.find_by(item_id: params[:share_id])
  @owned_share.toggle_active
  respond_to do |format|
    format.html { redirect_to item_path(@owned_share.item) }
    format.json { render :index, status: :ok, location: @owned_share }
  end
end

它获取当前用户的共享活动值并使用!替换它。请注意,如果它们没有默认值,则nil的否定返回true。

!true  # false
!false # true
!nil   # true

注意@owned_share.active == true也可以是@owned_share.active?@owned_share.active

答案 1 :(得分:1)

因为:

@owned_share = current_user.shares.find_by(params[:item_id])

应该是:

@owned_share = current_user.shares.find_by_item_id(params[:item_id])