如何限制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
相关产品推荐
相关产品推荐

