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

Rails中从用户详情页创建会议时如何正确设置recipient_id参数

失效原因

你在UsersController的show动作中给@meeting赋值的recipient_id仅存在于渲染用户详情页的单次请求周期中,没有随创建会议的表单提交到MeetingsController的create动作,因此赋值不会生效。

推荐实现方案(高安全性)

你已经配置了用户嵌套会议路由,直接通过路由自带的参数传递user_id即可,完全避免前端篡改风险:

  1. 调整用户详情页的会议表单提交地址,指定为嵌套路由地址:
# app/views/users/show.html.erb 里的表单配置
<%= form_with model: @meeting, url: user_meetings_path(@user) do |form| %>
  <!-- 其他会议字段,比如时间、主题等 -->
  <%= form.submit "预约会议" %>
<% end %>
  1. 修改MeetingsController的create动作,从路由参数中获取接收方用户id赋值:
# meetings controller
def create
  # 假设发起会议的是当前登录用户,存储在current_user中
  @meeting = current_user.meetings.new(meeting_params)
  # 直接从路由参数中拿到当前页面对应用户的id赋值
  @meeting.recipient_id = params[:user_id]
  if @meeting.save
    # 保存成功后的跳转逻辑
  else
    # 保存失败的错误处理逻辑
  end
end

# 注意这里不需要把recipient_id加入允许参数列表,因为没有从表单传值
def meeting_params
  params.require(:meeting).permit(:title, :start_time, :remark) # 替换为你实际需要的会议字段
end

如果需要更强的校验,可在赋值前增加用户存在性校验:

@recipient = User.find(params[:user_id])
@meeting.recipient = @recipient

替代实现方案(低复杂度)

如果不想调整控制器逻辑,也可以通过表单隐藏字段传值,但存在用户篡改前端字段的风险:

  1. 在用户详情页的会议表单中增加隐藏字段:
<%= form.hidden_field :recipient_id, value: @user.id %>
  1. 将recipient_id加入meeting_params的允许参数列表:
def meeting_params
  params.require(:meeting).permit(:title, :start_time, :remark, :recipient_id)
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:36:08