12

Estoy atascado con esta simple tarea de selección. Tengo estos modelos:Rieles: selección del botón de selección para objetos anidados

# id   :integer(4)  not null, primary key 
# category :string(255) 
# content :text 
class Question < ActiveRecord::Base 
    has_many :choices, :dependent => :destroy 
    accepts_nested_attributes_for :choices 
end 

# id   :integer(4)  not null, primary key 
# content  :text 
# correct  :boolean(1) 
# question_id :integer(4) 
class Choice < ActiveRecord::Base 
    belongs_to :question 
end 

Cuando creo una nueva pregunta, quiero especificar en una forma anidada no sólo el content del Question, pero incluso los content de 3 Answer objetos y seleccione con un botón de opción cuál es la respuesta correct. En la acción new del controlador, tengo esto:

def new 
    @title = "New Question" 
    @question = Question.new 
    3.times { @question.choices.build } 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @question } 
    end 
end 

Este es el código del formulario:

<%= simple_form_for @question do |question_form| %> 
    <%= question_form.error_notification %> 

    <div class="inputs"> 
    <%= question_form.input :content, :label => 'Question' %> 
    <%= question_form.input :category, :collection => get_categories, :include_blank => false %> 

    <% @question.choices.each do |choice| %> 
     <%= question_form.fields_for :choices, choice do |choice_fields| %> 
      <%= choice_fields.input :content, :label => 'Choice' %> 
      <%= choice_fields.radio_button :correct, true %> 
      <%= choice_fields.label :correct, 'Correct Answer' %> 
     <% end %> 
    <% end %> 
    </div> 

    <div class="actions"> 
    <%= question_form.button :submit %> 
    </div> 
<% end %> 

El problema es que este código producir tres botones de radio con diferentes nombres: puede seleccionar más de una respuesta correcta, y este no es el comportamiento correcto. Los nombres de los tres botones de opción son question[choices_attributes][0][correct], question[choices_attributes][1][correct] y question[choices_attributes][2][correct].

La pregunta es: ¿cómo puedo crear tres botones de opción con el mismo nombre, para seleccionar una y solo una respuesta correcta? ¿Cómo puedo crear un params gama correcta, con el fin de guardarlos en la acción create de esta manera:

def create 
    @question = Question.new(params[:question]) 
    # render or redirect stuff.... 
end 

Muchas gracias!

+0

tengo el mismo problema, por qué nadie ayudó a responder? :( –

+0

¿Alguna vez encontró una respuesta para esto? ¡Me rasgué el pelo! – henryeverett

Respuesta

0

Esto definitivamente funciona en Rails 4. No se han comprobado otras versiones:

su etiqueta & campos de radio debe tener este aspecto:

<%= choice_fields.radio_button :correct, true %> 
<%= choice_fields.label :correct, value: true, do %> 
    'True' 
<% end %> 
<%= choice_fields.radio_button :correct, false %> 
<%= choice_fields.radio_button :correct, value: false, do %> 
    'False' 
<% end %> 

Para el sello para activar el botón de opción de clic debe tener en value: whatever_your_value_is<%= choice_fields.label ... %>

7

Puede use radio_button_tag y páselo su propio nombre.

Siendo que todavía está en el alcance choice_fields, tiene acceso a algunos métodos que pueden exponer el objeto en el que está trabajando, lo que le ayudará a nombrar su radio_button_tag correctamente.

El siguiente código le dará a su botón de selección del nombre propio para ser aceptado como un atributo anidado:

<%= radio_button_tag "question[choices_attributes][#{choice_fields.index}][correct]", true, choice_fields.object.correct %>

choice_fields.index le da acceso al índice adecuado del recurso que se está creando, por lo que la primera coice tendrá el nombre question[choices_attributes][0][correct], el segundo question[choices_attributes][1][correct], etc.

choice_fields.object.correct le da acceso al valor actual de modo que el botón de opción correcta será completado para editar formularios.

Actualización: La solución anterior es realmente mal, le da a cada botón de un name atributo diferente para que no se terminan trabajando juntos (se pueden seleccionar varios botones de radio a la vez).

El Soltion Terminé yendo con se allong las siguientes líneas:

<%= radio_button_tag "question[choices_attributes][correct_choice]", choice_fields.index, choice_fields.object.correct %> 

Esto le da a cada botón de radio del mismo nombre que los otros, y un valor igual al índice de la opción correcta. El hash params termina pareciéndose a esto:

question: {choices_attributes: { 
     "0": {//choice 0}, 
     "1": {//choice 1}, 
     etc... 
    }, 
    correct_choice: //index of correct answer 
} 

entonces he actualizado mi controlador para actualizar manualmente la elección correcta de la siguiente manera:

def create 

    # Find the index of the correct choice in the params hash 
    correct_index = params[:question][:correct_choice] 

    # mark the question at the correct index as correct 
    params[:question][:choiceses_attributes][correct_index][:correct] = true 

    # Use the updated params hash to create a new Question/update an existing Question 

    @question = Question.new(params[:question]) 
    # render or redirect stuff.... 
end 
+1

¿Puede explicar su controlador con más información? –

+0

¡Claro! Agregué algunos comentarios al controlador para aclarar. –

Cuestiones relacionadas