Рубин на рельсах - PullRequest
       2

Рубин на рельсах

0 голосов
/ 21 марта 2011

(Единственное отличие в том, что во второй версии я пытаюсь вызвать form_form с помощью parens (), а в первом примере я не использую parens.) Я знаю, что могу очистить способ, которым я это делаю, но это был покрыт другой нитью.

ЭТО РАБОТАЕТ:

<%= form_for (@quiz_attempt.blank? ?  QuizAttempt.new(:patient_id => current_user.id, :started => Time.now.utc, :step_quiz_id => @course_step.step.step_quiz.id) : @quiz_attempt), :url => submit_quiz_course_course_step_path(@course_step.course, @course_step) do |f| %>

НО ЭТОГО НЕ ДЕЛАЕТ: (Попытка использовать form_for с помощью функции form_for ()

<%= form_for ((@quiz_attempt.blank? ?  QuizAttempt.new(:patient_id => current_user.id, :started => Time.now.utc, :step_quiz_id => @course_step.step.step_quiz.id) : @quiz_attempt), :url => submit_quiz_course_course_step_path(@course_step.course, @course_step)) do |f| %>

ОШИБКА

ERROR:/Users/cmuench/rails_projects/infosurge/app/views/course_steps/show_quiz.html.erb:10: syntax error, unexpected ',', expecting ')'
...step_quiz.id) : @quiz_attempt), :url => submit_quiz_course_c...
...                               ^
/Users/cmuench/rails_projects/infosurge/app/views/course_steps/show_quiz.html.erb:10: syntax error, unexpected ')', expecting keyword_end
...rse_step.course, @course_step)) do |f| @output_buffer.safe_c...
...                               ^
/Users/cmuench/rails_projects/infosurge/app/views/course_steps/show_quiz.html.erb:27: syntax error, unexpected keyword_ensure, expecting $end
Extracted source (around line #10):

7:     <p><%= @course_step.step.step_quiz.instructions %> </p>
8:   </div>
9: <div id="Quiz">
10:     <%= form_for ((@quiz_attempt.blank? ?  QuizAttempt.new(:patient_id => current_user.id, :started => Time.now.utc, :step_quiz_id => @course_step.step.step_quiz.id) : @quiz_attempt), :url => submit_quiz_course_course_step_path(@course_step.course, @course_step)) do |f| %>
11:     <%= render :partial => 'shared/error_messages', :object => f.object %>
12:         <% @course_step.step.step_quiz.step_quiz_questions.each do |quiz_question| %>
13:             <h3><%= quiz_question.value %></h3>
Trace of template inclusion: app/views/course_steps/show_quiz.html.erb

1 Ответ

1 голос
/ 21 марта 2011

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

Вместо того, чтобы пытаться отобразить все тонкости синтаксического анализатора ruby, почему бы не попытаться сделать код читабельным?

Самый простой способ - использовать оператор ||= и перенести эту логику в контроллер.

Сравните расширенную форму вашего первого примера:

Controller: 

 Not Shown

View:

<%= form_for (
    (@quiz_attempt.blank? ?  
      QuizAttempt.new(
        :patient_id => current_user.id, 
        :started => Time.now.utc, 
        :step_quiz_id => @course_step.step.step_quiz.id) : 
      @quiz_attempt
    ),
  :url => submit_quiz_course_course_step_path(@course_step.course, @course_step)
             ) do |f| %>

Кому:

Controller:
#... near the end of the relevant action
@quiz_attempt ||= QuizAttempt.new(:patient_id => current_user.id, 
                                  :started => Time.now.utc, 
                                 :step_quiz_id => @course_step.step.step_quiz.id)

View:

<%= form_for @quiz_attempt, :url => 
submit_quiz_course_course_step_path(@course_step.course, @course_step) do |f| %>

Таким образом, вы можете использовать стиль без паренов, не имея запутанных ?: битов, забивающих все.

Надеюсь, это поможет.


* В качестве отступления вот:

Что я думаю не так

form_for() не обязательно совпадает с form_for (), поэтому может возникнуть путаница относительно того, пытаетесь ли вы сказать

"вызов form_for с результатом (@quiz_attempt, :url => url) #which is not valid syntax"

или

"вызов form_for с аргументами (@quiz_attempt, {:url => url}) #which is what the real arguments look like.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...