【问题标题】:Rails radio buttons not working properly and related issuesRails 单选按钮无法正常工作及相关问题
【发布时间】:2016-10-23 16:03:10
【问题描述】:

我创建了三个模型,“调查”、“问题”和“答案”。调查 has_many Questions which has_many Answers(它们都属于上面的模型)。

这是我想显示问题并提交用户输入的表单:

<%= form_for(:quiz_responses, url: quiz_responses_path) do |f| %>

<%= f.hidden_field :name, value: @survey.name %>

<% @questions.each do |question| %>
<ul> 
<%= f.hidden_field :question, value: question.content %>
<%= f.label question.content %>

<% question.answers.each do |answer| %>

<%= f.hidden_field :answers, value: answer.content %>

<%= f.label answer.content %>
<%= f.radio_button(:user_answer, answer.content) %>

<% end %>

它有几个问题:

  1. 如果我创建了多个问题,例如 2 个问题,我将获得 8 个单选按钮,每个问题有 4 个(预期结果)。但是,我只能从 8 个单选框中选择一个(而不是每个问题的 4 个单选框中的一个),并且只提交了一个 :user_answer 值。我该如何解决这个问题?

  2. 这很可能与#1 相关,但&lt;%= f.hidden_field :answers, value: answer.content %&gt; 在我提交表单时只产生一个值(最后一个答案值)。我希望它提交所有答案值(所以如果我有 2 个问题,我将得到一个包含 8 个答案值而不是 1 个的参数哈希)。 &lt;%= f.hidden_field :question, value: question.content %&gt;

  3. 也会出现类似的问题

【问题讨论】:

  • 您应该观看这两个链接以了解嵌套字段:railscasts.com/episodes/196-nested-model-form-part-1railscasts.com/episodes/197-nested-model-form-part-2。我认为这正是你的情况。
  • 我应该澄清一下。我在创建调查的表单中使用了嵌套字段。我在上面发布的表单是在创建调查之后,我在其中显示用户输入的调查。我不知道嵌套表单是否是最好的方法。
  • 如果您保存了调查,那么为什么需要 form_for 来显示它?目前尚不清楚您要在这里实现什么,但如果没有嵌套表单,您很可能会为字段或其他内容获得重复的 id。我仍然建议您观看那些 railscasts。该网站对初学者非常有用。
  • 我确实看过他们。有两种 form_for,因为它们执行不同的操作:一种形式是让我创建测验、添加问题和答案。第二种形式是显示测验问题和答案并获得用户输入(即选择他们认为正确的答案)。不过我想我现在知道该怎么做了。
  • 好吧,查看您的服务器日志以查看您真正将多少问题/答案保存到数据库中,并查询您的数据库以确认。您还可以尝试为每个 user_answer 创建一个单独的表单。不幸的是,您的问题没有提供足够的信息来说明可能出现的问题,因为这取决于保存的内容以及模型的外观。

标签: ruby-on-rails


【解决方案1】:

您的 1. 是因为所有 8 个单选按钮都有名称 user_answer。您需要确保每个组都有不同的名称,例如包含问题 ID 的名称。也许"user_answer[#{q.id}]" 所以你在后端得到一个哈希值。

对于 2.,我希望您的浏览器实际上发送了所有 8 个值(您可以使用 Inspector 的 Network 选项卡检查),但 Rails 只给您一个,因为它如何处理参数。同样,您应该确保每个隐藏字段都有一个唯一的名称(这次结合了问题 ID 和答案 ID)。

【讨论】:

  • 您好,感谢您的回答。我设法修复它。但是,有没有办法从 0 开始对每个答案和问题进行排序?例如,由于我的数据库中存储了一堆答案,因此执行 会给我一个答案散列,其中元素开始无论第一个 answer.id 是什么。我设法通过将其更改为 answer[#{answer_counter}] 并在运行该行后增加 answer_counter 来使它们从 0 开始,但它似乎有点......不对。
  • 好吧,你可以为所欲为,因为你只是在创建 &lt;input&gt; 元素,即使在 2016 年,它也只是 HTML 和“CGI”。但是某些参数名称使 Rails 具有“魔力”,例如foo[bar],因此最好尽可能使用它们。 (尽管bar 不需要是一个 id。)另外,如果增加计数会让您感到困惑,请尝试使用 each 而不是 each_with_index
猜你喜欢
  • 2013-11-11
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2013-03-27
  • 2012-12-28
相关资源
最近更新 更多