Rails中从用户详情页创建会议时如何正确设置recipient_id参数
失效原因
你在UsersController的show动作中给@meeting赋值的recipient_id仅存在于渲染用户详情页的单次请求周期中,没有随创建会议的表单提交到MeetingsController的create动作,因此赋值不会生效。
推荐实现方案(高安全性)
你已经配置了用户嵌套会议路由,直接通过路由自带的参数传递user_id即可,完全避免前端篡改风险:
- 调整用户详情页的会议表单提交地址,指定为嵌套路由地址:
# app/views/users/show.html.erb 里的表单配置 <%= form_with model: @meeting, url: user_meetings_path(@user) do |form| %> <!-- 其他会议字段,比如时间、主题等 --> <%= form.submit "预约会议" %> <% end %>
- 修改
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
替代实现方案(低复杂度)
如果不想调整控制器逻辑,也可以通过表单隐藏字段传值,但存在用户篡改前端字段的风险:
- 在用户详情页的会议表单中增加隐藏字段:
<%= form.hidden_field :recipient_id, value: @user.id %>
- 将
recipient_id加入meeting_params的允许参数列表:
def meeting_params params.require(:meeting).permit(:title, :start_time, :remark, :recipient_id) end
内容的提问来源于stack exchange,提问作者Mozart Len
相关产品推荐
相关产品推荐

