You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制Simple Form关联仅显示当前用户的账户

解决Rails 7费用追踪器中交易表单仅显示当前用户账户的问题

前端表单修改(直接限制下拉选项)

修改Simple Form中的账户关联字段,明确指定collection为当前用户的账户列表:

<%= f.association :account, 
                  collection: current_user.accounts,
                  label_method: :acc_name, 
                  value_method: :id, 
                  prompt: "Choose account" %>

同理,分类下拉也应该只显示当前用户的分类,同步修改:

<%= f.association :category, 
                  collection: current_user.categories,
                  prompt: "Choose category" %>

后端权限加固(防止恶意提交)

前端限制仅为视觉层面,必须通过Pundit在后端验证提交的账户归属,避免用户通过篡改请求提交不属于自己的账户ID。

在app/policies/transaction_policy.rb中,修改create?方法并添加辅助验证方法:

class TransactionPolicy < ApplicationPolicy
  def create?
    account_owned_by_user? && category_owned_by_user?
  end

  private

  def account_owned_by_user?
    record.account.user == user
  end

  def category_owned_by_user?
    record.category.user == user
  end
end

然后在TransactionsController的create动作中,确保调用Pundit的权限验证:

def create
  @transaction = Transaction.new(transaction_params)
  authorize @transaction # 触发权限验证

  if @transaction.save
    redirect_to transactions_path, notice: "Transaction created successfully."
  else
    render :new
  end
end

补充说明

  • 前端通过current_user.accounts直接筛选当前用户的账户,确保下拉列表仅展示自身账户
  • 后端Pundit验证是核心防护,避免用户通过手动修改请求参数提交不属于自己的账户
  • 分类字段同步处理,保持权限逻辑一致性

内容的提问来源于stack exchange,提问作者jkvithanage

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:50:34