Rails 6 向partial传参修改表单隐藏域value触发校验报错咨询
错误原因
- 你渲染partial时传入的
value参数没有在partial中被使用,两个隐藏域仍然读取硬编码的current_user.id,上下文不存在对应变量时就会得到nil - 没有同步传入
messageable_type对应的参数,即便id正确也会触发关联校验失败
正确实现方案
第一步:修改partial代码,替换硬编码值为动态局部变量
直接使用messageable作为统一传参对象,同时用Rails自带的hidden_field方法简化隐藏域写法:
# app/views/messages/_new.html.erb <%= simple_form_for [@conversation, @message] do |f| %> <%= f.text_area :body %> <%= f.hidden_field :messageable_id, value: messageable.id %> <%= f.hidden_field :messageable_type, value: messageable.class.name %> <%= f.submit "Send Reply" %> <% end %>
可选优化:可以在partial开头加默认值兜底,避免未传参时抛出变量未定义错误:
<% # 放在partial第一行即可,默认缺省值可根据业务场景调整 <% messageable ||= current_user %>
第二步:渲染partial时传入对应参数
调用时直接传入完整的messageable对象即可,不需要拆分传id和type,避免参数不匹配:
# app/views/admin/conversations/_show.html.erb <%= render 'messages/new', messageable: current_admin_user %>
其他场景需要传普通用户时直接修改参数值即可:
<%= render 'messages/new', messageable: current_user %>
内容的提问来源于stack exchange,提问作者mr_muscle
相关产品推荐
相关产品推荐

