2015-09-23 5 views
1

У меня есть модель оценки, например Rails Survey Gem (runtimerevolution), там учитель создает оценку MCQ для ученика. Его параметры находятся в типе переключателя. там один вариант правильный.Как сохранить выбранное значение переключателя в модели

Когда студент обращается за оценкой MCQ, он получает вопросник, на котором у Вопроса есть несколько вариантов, и студент выбирает один вариант с помощью переключателя.

Так что я просто хочу сохранить выбранный option_id относительно question_id в моей новой попытке модели.

Здесь применима страница MCQ для студентов.

<div class="stream-cont"> 
    <%= form_tag(action: "apply") do %> 
     <% @mcq.questions.each_with_index do |q, i| %> 
      <div class="feed-cont-title all-header"> 
       <p> 
        <%="Question-#{i+1}: "+ q.question %> 
       </p> 
       <p> 
        <strong>Answer : </strong> 
        <%= 
         collection_radio_buttons("questions[#{q.id}]", :option_id, q.options, :id, :option) do |b| 
         b.label(style: "display:block") { b.radio_button + b.text } 
         end 
        %> 
       </p> 
      </div> 
     <% end %> 
    <% end %> 
    <%= submit_tag "Submit Answer", :class => "typeD button" %> 
</div> 

здесь контроллер McQ

def apply 

      @club = current_user.clubs 
      if current_user.user_type == User::User_types[:student] 
       @mcq = Mcq.find(params[:id]) 
      end 

      @attempt = current_user.attempts.new 

      @mcq = Mcq.find(params[:id]) 
      @attempt = current_user.attempts.new(attempt_params) 
      @attempt.save 
      redirect_to attempt_id(@attempt.id), notice: "Thank you" 
     end 

     Private 
     def attempt_params 
      params.require(:attempt).permit(:user_id, :mcq_id, :question_id, :option_id) 
     end 
    end 

это не является полным, и я знаю, что это неправильно. Я просто хочу знать, как я выбрал Option_id относительно question_id и сохранил это значение в столбце option_id модели try.

У меня есть идея, как управлять им и что следует использовать в поле зрения и контроллере.

ответ

0

Mcq на самом деле модель верхнего уровня здесь, а не попытка, поэтому я считаю, что вложенность вызывает немного путаницы.

В этой ситуации вы можете использовать form_for и fields_for, чтобы вложить в нее хаос params. Это будет выглядеть примерно так:

<%= form_for @mcq do |f| %> 
    <% f.fields_for :question |question_fields, i| %> 
     <div class="feed-cont-title all-header"> 
      <p> 
       <%="Question-#{i+1}: "+ question_fields.object %> 
      </p> 
      <p> 
       <strong>Answer : </strong> 
        <% question_fields.fields_for :option |option_fields| %> 
         <%= option_fields.radio_button(:id) %> 
         <%= option_fields.label(:name) %> 
        <% end %> 
      </p> 
     </div> 
    <% end %> 
<% end %> 

Затем вы хотите, чтобы ваш контроллер в белый список Params, как:

Private 
    def mcq_params 
     params.require(:mcq).permit(:user_id, :mcq_id, questions_attributes[ :id, :options_attributes[:id]]) 
    end 

Когда вы отправите форму, ваш PARAMS будет выглядеть как

:mcq[:user_id, :id, questions_attributes[][:id, :options_attributes[:id]] 

В этот момент вы просто перебираете хэш атрибутов вопросов для создания объектов попыток для пользователя.

Извините, если код не находится на месте - я не уверен, что полностью понимаю отношения между вопросом и параметрами, но это должно заставить вас идти по пути. Если это слишком скромно, вы можете сохранить коллекцию радиокнопок, я просто обнаруживаю, что со временем формы, как правило, усложняются, поэтому приятно иметь рельсы, которые их гнездят для вас.

+0

Аналогичный подход, который я использовал, но я получаю ошибку - «Параметр отсутствует или значение пуст: попытка« В строке »params.require (: попытка) .permit (: user_id,: mcq_id, questions_attributes [: id,: option_id ]) ' –

+0

Вероятно, это связано с тем, что option_id вложен в атрибуты вопросов. если вы полностью их вложите, как указано выше, у вас будут только: столбцы id для обоих вопросов и параметров. – joem

1

Во-первых, почему у вас есть метод apply?


Рельсы в значительной степени зависят от инфраструктуры CRUD; Ваш запрос должен перейти в applications контроллер, привязанный к Application модели:

#app/models/application.rb 
class Application < ActiveRecord::Base 
    #columns id | mcq_id | user_id | created_at | updated_at 
    belongs_to :mcq 
    belongs_to :user 
    has_many :answers, class: "ApplicationAnswer" 
    accepts_nested_attributes_for :answers 
end 

#app/models/application_answer.rb 
class ApplicationAnswer < ActiveRecord::Base 
    #columns id | application_id | question_id | answer_id | created_at | updated_at 
    belongs_to :application 
    belongs_to :question 
    belongs_to :answer 
end 

#app/models/mcq.rb 
class MCQ < ActiveRecord::Base 
    has_many :applications 
    has_many :questions 
    has_many :answers, through: :questions 
end 

#app/models/question.rb 
class Question < ActiveRecord::Base 
    #columns id | mcq_id | etc | etc 
    belongs_to :mcq 
    has_many :answers 
    accepts_nested_attributes_for :answers #-> you can make a nested form; each time you make a question, you can make answers 
end 

#app/models/answer.rb 
class Answer < ActiveRecord::Base 
    #columns id | question_id | value | created_at 
    belongs_to :question 
end 

выглядит сложным; все это делится на ваши данные следующим образом:

  1. MCQ (сборник вопросов & возможных ответов)
  2. Applications (пользователь предоставляет данные, такие как, почему хочет присоединиться и т.д.)
  3. ApplicationAnswers (пользователя ответы на вопросы. Отдельная модель для обеспечения расширяемости (IE может добавить столько ответов на вопрос)
  4. Questions (привязано к MCQ; предоставляет возможность добавить вопрос & назначить ответы к нему).

-

Это означает, что вы можете сделать следующее:

#config/routes.rb 
resources :mcqs, only [:show] do 
    resources :applications, only: [:new, :create] #-> url.com/mcq/:id/applications/new 
end 

#app/controllers/applications_controller.rb 
class ApplicationsController < ApplicationController 
    def new 
     @mcq = MCQ.find params[:id] 
    end 
    def create 
     @mcq = MCQ.find params[:id] 
     @application = @mcq.applications.new application_params 
     if @application.save 
     # ... 
     else 
     # ... 
     end 
    end 

    private 

    def application_params 
     params.require(:application).permit(:application, :params, :mcq_id, answer_params: [:question_id, :application_id, :answer_id]).merge(user_id: current_user.id) 
    end 
end 

Теперь форма вы хотите создать имеет возможность сохранять ApplicationAnswersчерез ваш Application:

#app/views/applications/new.html.erb 
<%= form_for @mcq.applications.new do |f| %> 
    <%= f.text_field :your_mcq_stuff_here %> 
    <%= f.fields_for :answers, @mcq.questions do |question| %> 
     <%= question.hidden_field :question_id, question.id %> 
     <%= question.collection_radio_buttons :answer_id, question.answers.all, :id, :value %> 
    <%= f.submit %> 
    <% end %> 
<% end %> 

Несколько вопросов здесь включают проблему с вопросом n+1, и тот факт, что я ее не тестировал.

-

Если это работает должным образом, вы будете в основном быть в состоянии дать users возможность подать Application к MCQ. Каждый MCQ будет иметь номер Questions, причем эти вопросы имеют серию Answers.

Возможно, это потребует настройки; это структура, которую я бы использовал для этого типа проекта.

+0

Да, я использую этот подход для создания Mcq и его успешного завершения. На этапе студента я хочу поймать выбранный option_id и сохранить его в модели попытки. Так что я выполняю операцию проверки для результата ученика. –

+0

Это именно то, что я описал. Извините, мой код не вырезано и не вставляется, вам нужно будет разобраться, как это сделать самому. –

+0

Я использую '<% = question.collection_radio_buttons: question, que.options,: id,: option%>' It pass '" попытка "=> {" попытка_options_attributes "=> {" 0 "=> {" question "=>" 31 "," id "=>" 15 "}," 1 "=> {" question "=>" 33 "," id "=>" 16 "}," 2 "=> {" question "=>" 35 "," id "=>" 17 "}}}," commit "=>" Create Attempt "}', но 'Unpermitted parameters: question, id' .... Я хочу, чтобы хранилище ** вопрос * * значение в столбце option_id модели «Попытка» .... –

Смежные вопросы