Ruby on Rails 4,在视图中形成

Posted

技术标签:

【中文标题】Ruby on Rails 4,在视图中形成【英文标题】:Ruby on Rails 4, form inside a view 【发布时间】:2017-01-04 02:38:35 【问题描述】:

我目前正在尝试构建一个向用户显示问题的视图,如果他们正确回答了问题,则允许用户选中一个复选框,该复选框发送请求以将其保留在数据库中。换句话说,我们跟踪数据库中用户正确回答了哪些问题。 现在我的问题是(除了作为 RoR 和前端的完整新手之外),我不知道如何在我的视图中插入复选框(表单)以及问题。 我正在使用rails 4。 谢谢!

【问题讨论】:

您可能不需要这样的复选框,任何像按钮这样的元素都可以完成这项工作......换句话说,您不需要包含另一个表单元素或表单。你是在说多项选择题吗??下面用一个小例子回答你的问题。 请添加更多细节,例如代码 sn-p 和用例..不确定我的想法是否正确..不想在这里假设事情 @Abhinay 你对按钮的看法可能是对的......不,这不是一个选择题,只是一个用于问题的文本字段,当用户想要时,单击以在另一个文本字段中显示答案。如果他们答对了问题,我想要一种方法来记录它并将数据库中的布尔值设置为 true 以了解他们正确回答了哪些问题。 很高兴了解您在做什么 当然,很简单。我有 3 个表:字段、类别、测验。测验有上面提到的列。因此,用户可以通过添加问题、答案并选择字段和类别来通过表单(新测验)创建新测验。现在在 quizzes_controller 中,我添加了一个新方法,允许用户查看问题,单击以显示答案,如果他们的答案正确,请单击或选中复选框,以便我知道他们答对了哪些问题并且不会显示他们再次提出这些问题。我可以做的类似于编辑记录,但我不希望答案和问题是可编辑的。 【参考方案1】:

我会开始为所有答案添加一个布尔值。

$  rails g migration AddCorrectToAnswers

现在迁移应该是这样的

class AddCorrectToAnswers < ActiveRecord::Migration[5.0]
  def change
    add_column :answers, :correct, :boolean, default: false
  end
end

现在我们可以创建一条新路线,将答案标记为正确

# config/routes.rb

Rails.application.routes.draw do
  ...
  resources :questions do
    resources :answers do
     match "/correct" => "answers#correct", :as => :correct, via: :all
    end
  end
  ...
end

现在你应该有一条新路线

question_answer_correct        /questions/:question_id/answers/:answer_id/correct(.:format) answers#correct

我假设答案在问题显示页面中

现在在你的展示页面中你可以做这样的事情

# app/views/questions/show.html.erb

<% @question.answers.each do |answer| %>
  <%= answer.answer %>
  <%= form_for @user, :url => url_for(:controller => 'answers', :action => 'correct') %>
    <%= f.label "Correct Answer" %> <br />
    <%= f.check_box :correct %> <br />
    ....
  <%end %>
<% end %>

现在你要做的最后一件事是在答案控制器中创建一个名为正确的方法来将答案标记为正确

# app/controllers/answers_controller.rb
class AnswersControlle < ApplicationController
  ...
  def correct
    @answer = Answer.find(params[:answer_id])
    @answer.correct = true
    @answer.save
    redirect_to :back
  end
end

希望对你有帮助

快乐编码

【讨论】:

上述问题的答案和这个解决方案,问题和答案都在同一个表格中。 class CreateQuizzes &lt; ActiveRecord::Migration def change create_table :quizzes do |t| t.integer :field_id t.integer :category_id t.string :question t.string :answer t.timestamp :last t.boolean :was_correct t.timestamps null: false end end end【参考方案2】:

假设您已经设置了表单,

你可以添加一个按钮,上面写着提交或任何你想显示的东西

<button class="check">Click me</button>

现在您可以为此按钮编写一个事件侦听器,它可以显示答案,如果它与用户给出的答案匹配,则触发并 Ajax 调用您的后端并保存您想要的任何内容。

示例代码:

$('.check').on('click', function()
  var real = $('.reveal-answer').val();
  $('.reveal-answer').show();   // you need to protect this part from being abused
  var answer = $('.user-input-answer').val();   //Assuming its a input field
 var questionId = $('.question').data('question-id');
 if(answer === real)
   url = '/submit_answer';
   data =  question_id: questionId, answer: answer ;
   $.post( url, data , function() 
   , 'json');
 
);

大致上它应该像这样工作,但从安全角度来看还有很多工作要做。例如:您不能在视图端获得所有答案,您应该在提交答案后进行后端验证(检查它是否真的正确或有人试图破解它。)

【讨论】:

在此之后,您可以使用此处发布的另一个答案来解决后端问题。

以上是关于Ruby on Rails 4,在视图中形成的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 中一个共享视图的两个控制器

Ruby on Rails:一对多关系视图

Ruby on Rails 在带有静态脚本文件的视图中渲染

在 Ruby on Rails 3.2+ 中流式传输部分视图

在 Ruby on Rails 4.2 中使用 Cocoon gem 嵌套表单

Ruby on Rails 使用视图助手中的变量在视图中动态生成字段名称