Rails中如何在ERB的text_field显示关联Quiz的所有Question ID?
解决Rails中在text_field显示关联模型ID的问题
嘿,我来帮你搞定这个问题~ 你现在的问题是直接把关联对象传给text_field,它只会显示对象的字符串表示,而不是你想要的Question ID集合。这里有几种简单的实现方式:
方法1:在视图中直接处理(快速实现)
如果只是单纯想显示ID,不需要后续处理提交的内容,直接在视图里提取ID并格式化就行:
假设你是用form_for来构建表单的,代码可以写成这样:
<%= form_for @quiz do |f| %> <%= f.text_field :question_ids, value: @quiz.questions.pluck(:id).join(', ') %> <% end %>
要是不用form_for,用text_field_tag的话:
<%= text_field_tag 'quiz[question_ids]', @quiz.questions.pluck(:id).join(', ') %>
这里的pluck(:id)会直接从关联的Question中取出所有ID组成数组,join(', ')再把数组转成逗号分隔的字符串,这样输入框里就会显示类似1, 2, 3的ID列表啦。
方法2:用模型虚拟属性(更优雅,支持提交更新)
如果还需要在提交表单时更新Quiz关联的Question,推荐在Quiz模型里加个虚拟属性,这样代码复用性更好:
先在app/models/quiz.rb里添加:
# 用于显示ID字符串 def question_ids_string questions.pluck(:id).join(', ') end # 处理提交的ID字符串,更新关联 def question_ids_string=(ids_str) # 把逗号分隔的字符串转成整数数组,过滤掉空值 self.question_ids = ids_str.split(',').map(&:strip).reject(&:empty?).map(&:to_i) end
然后在视图里就可以直接用这个虚拟属性:
<%= form_for @quiz do |f| %> <%= f.text_field :question_ids_string %> <% end %>
这样不仅显示的时候更简洁,提交表单时还能自动把输入的ID字符串转成关联的Question ID数组,直接更新Quiz的关联关系~
为什么你的原写法不行?
你原来的<%= text_field(:quiz, :quiz_questions) %>会调用关联集合quiz_questions的to_s方法,所以显示的是类似#<ActiveRecord::Associations::CollectionProxy[...]>的对象字符串,而不是我们需要的ID列表。必须主动提取ID并格式化才行哦。
内容的提问来源于stack exchange,提问作者Lax_Sam
相关产品推荐
相关产品推荐

