2016-06-17 9 views
1

Ich bin ein Anfänger, der eine App für meine Sprachschüler erstellt, die überprüft, ob der Benutzer einen Begriff korrekt in ein Formular kopiert hat. Das Word-Modell hat ein Attribut: term, das der Benutzer kopiert. Das Word-Expositionsmodell ist dem Word-Modell zugeordnet. Bei der Registrierung wird für jedes Wort der WordExposition-Word-Verknüpfung: completed das Attribut false festgelegt. Ich versuche, ein Formular in der WordExposition-Showansicht zu implementieren. Wenn der Benutzer den richtigen Begriff eingibt, ändert sich das Attribut WordExposition completed vom Standardwert false in true.: Aktualisierungsformular speichert keinen booleschen Wert

Um zu überprüfen, ob der Word.term mit dem Ausdruck übereinstimmt, den der Student kopiert habe, habe ich eine word_from_student_matches_word Methode im WordExposition-Modell, die ich vor der Aktualisierung ausführen möchte. Ab sofort bekomme ich undefined local variable or method word_from_student_matches_word' bei der Einreichung des Formulars. Wie kann ich nach übereinstimmenden Schreibweisen suchen und das boolesche Attribut aus der Ansicht aktualisieren?

WordExposition Modell:

class WordExposition < ActiveRecord::Base 
    belongs_to :enrollment 
    belongs_to :word 

    delegate :term, to: :word 
    delegate :reference, to: :word 
    delegate :image, to: :word 
    delegate :sound, to: :word 

    attr_accessor :term_given_by_student 
    validate :word_from_student_matches_word, on: :update 

    def word_from_student_matches_word 
    return true if word.term == term_given_by_student 
    errors.add(:term_given_by_student, "Terms don't match") 
    end 

    def next_word_exposition 
    WordExposition.where(["id > ? AND lesson_id = ?", id, lesson_id]).first 
    end 
end 

Wort Expositions-Controller:

class WordExpositionsController < ApplicationController 
    before_action :authenticate_user! 
    before_action :require_enrollment_in_lesson 

    def show 
    @word = current_enrollment.word_expositions.find_by!(word_id: params[:id]) 
    end 

    def update 
    current_word_exposition 
    if word_from_student_matches_word 
     current_word_exposition.completed = true 
     current_word_exposition.save 
    end 
    end 

    private 

    helper_method :current_lesson 
    def current_lesson 
    @current_lesson ||= Lesson.find(params[:lesson_id]) 
    end 

    helper_method :current_enrollment 
    def current_enrollment 
    @current_enrollment ||= Enrollment.find_by!(lesson_id: params[:lesson_id], user_id: current_user.id) 
    end 

    def require_enrollment_in_lesson 
    if !(current_user.enrolled_in?(current_lesson)) 
     redirect_to lesson_path(current_lesson), alert: 'You need to enroll in order to view the activities!' 
    end 
    end 

    def word_exposition_params 
    params.require(:word_exposition).permit(:completed) 
    end 

    def current_word_exposition 
    @current_word_exposition ||= WordExposition.find(params[:id]) 
    end 
end 

Wort Expositions Sicht anzeigen:

<h1>Word Exposition</h1> 

<!-- display the term to be copied --> 
<div class="col-xs-10 col-xs-offset-1"> 
    <h2><%= @word.term %></h2><br> 

    <!-- Form to check matching spelling and update WordExposition :completed to true if correct --> 
    <%= simple_form_for @word, url: lesson_word_exposition_path(current_lesson, @word), method: :patch do |f| %> 
    <%= f.input :term_given_by_student, label: "Enter the term exactly as above:" %><br> 
    <%= f.button :submit, class: 'btn btn-primary' %> 
    <% end %> 
</div> 

Rake Routen:

 lesson_enrollments POST /lessons/:lesson_id/enrollments(.:format)   enrollments#create 
    lesson_word_exposition GET /lessons/:lesson_id/word_expositions/:id(.:format) word_expositions#show 
         PATCH /lessons/:lesson_id/word_expositions/:id(.:format) word_expositions#update 
         PUT /lessons/:lesson_id/word_expositions/:id(.:format) word_expositions#update 
       lessons GET /lessons(.:format)         lessons#index 
        lesson GET /lessons/:id(.:format)        lessons#show 
        word GET /words/:id(.:format)         words#show 
    teacher_lesson_words POST /teacher/lessons/:lesson_id/words(.:format)   teacher/words#create 
new_teacher_lesson_word GET /teacher/lessons/:lesson_id/words/new(.:format)  teacher/words#new 
edit_teacher_lesson_word GET /teacher/lessons/:lesson_id/words/:id/edit(.:format) teacher/words#edit 
    teacher_lesson_word PATCH /teacher/lessons/:lesson_id/words/:id(.:format)  teacher/words#update 
         PUT /teacher/lessons/:lesson_id/words/:id(.:format)  teacher/words#update 
         DELETE /teacher/lessons/:lesson_id/words/:id(.:format)  teacher/words#destroy 
     teacher_lessons POST /teacher/lessons(.:format)       teacher/lessons#create 
     new_teacher_lesson GET /teacher/lessons/new(.:format)      teacher/lessons#new 
    edit_teacher_lesson GET /teacher/lessons/:id/edit(.:format)     teacher/lessons#edit 
      teacher_lesson GET /teacher/lessons/:id(.:format)      teacher/lessons#show 
         PATCH /teacher/lessons/:id(.:format)      teacher/lessons#update 
         PUT /teacher/lessons/:id(.:format)      teacher/lessons#update 
         DELETE /teacher/lessons/:id(.:format)      teacher/lessons#destroy 
+0

In Ihrer Steuerung rufen Sie 'word_from_student_matches_word' auf, aber diese Methode ist in der Modellinstanz definiert. –

Antwort

0

Sie sind falsch in Ihrem Controller

def update 
    current_word_exposition 
    current_word_exposition.completed = true #this line move to callback in your model changing the flag before save 
    if current_word_exposition.save 
    #nothing o something 
    else 
    #do something 
    end 
end 

Ihr Modell den Begriff auf Update wird die Validierung und return false, wenn etwas schief gelaufen ist. Sie müssen lediglich die Modellinstanz speichern und das Ergebnis steuern

+0

Ich habe eine else-Warnung hinzugefügt, die auch dann angezeigt wird, wenn die Begriffe übereinstimmen. Dies bedeutet, dass die Validierung nicht ausgeführt wird und das Update nicht gespeichert wird. Irgendwelche Ideen, wie man das löst? Gracias por la Ayuda! – gonzalo2000

+0

Da Sie den neuen Wert nicht in die Modellinstanz, current_word_exposition.term = params [: word] [: term] oder current_word_exposition.update (params) eingeben und Ihre word_exposition_params-Methode ebenfalls falsch ist, muss sie Folgendes zulassen: term_given_by_student und nicht: completed – DennisCastro

+0

Funktioniert das immer noch, wenn mein WordExposition-Modell nur einen abgeschlossenen booleschen Parameter enthält? Ich möchte das Wort, das in der Form ist, nicht weitergeben, nur um es zu aktualisieren, wenn die Begriffe übereinstimmen. – gonzalo2000

Verwandte Themen