Rails - используя приращение!с пользовательским вводом - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь присвоить баллы ученикам в моем приложении RailsУ них есть параметр под названием: очки.Я хочу обновить количество баллов, которое они набрали, основываясь на пользовательском вводе учителя - они могут дать им 1 балл, 2 балла, 5 баллов и т. Д. Я использую приращение!но я могу выбрать только 1 значение, чтобы дать им.Я написал заявление if, которое не работает.Этот код работает:

    <%= form_for student do |f| %>
      <%= f.submit "+ 1" %>
    <% end %>
    <%= form_for student do |g| %>
      <%= g.submit "+ 2" %>
    <% end %>

и контроллер:

  def update
     @student = Student.find(params[:id])
       @student.increment!(:points, 1)
       redirect_to '/pages/points'
 end

, но он может увеличиваться только на 1 пункт (обе кнопки увеличиваются на 1).Итак, я написал это выражение if и включил скрытые поля для обновления: количество параметров:

       <%= form_for student do |f| %>
       <%= f.hidden_field :amount, :value => 1 %>
        <%= f.submit "+ 1" %>
       <% end %>
       <%= form_for student do |g| %>
       <%= g.hidden_field :amount, :value => 2 %>
         <%= g.submit "+ 2" %>
       <% end %>

и контроллер:

   def update
     @student = Student.find(params[:id])
     if :amount == 1
       @student.increment!(:points, 1)
       redirect_to '/pages/points'
     elsif :amount == 2
       @student.increment!(:points, 2)
       redirect_to '/pages/points'
     else
       @student.increment!(:points, 3)
       redirect_to '/pages/points'
     end
   end

, и это каждый раз возвращает 3 балла, что означает: суммане обновляется в скрытом поле.Я поступаю об этом неправильно?Есть ли лучший способ использовать приращение!изменить значения баллов, или есть другой способ обновления: сумма, так что мой оператор if будет работать?Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 января 2019

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

<%= form_for student do |f| %>
  <%= f.submit "+ 1" %>
  <%= f.submit "+ 2" %>
<% end %>

, затем просто отметьте params[:commit]

   def update
     @student = Student.find(params[:id])
     case params[:commit]
     when '+ 1'
       @student.increment!(:points, 1)
     when '+ 2'
       @student.increment!(:points, 2)
     else
       @student.increment!(:points, 3)
     end       
     redirect_to '/pages/points'
   end

Эта строка не имеет смысла вRuby ...

if :amount == 1

:amount является символом, 1 является целым числом.Они никогда не могут быть равными.Это все равно, что сказать

if "cat" == 7

Символы сами по себе никогда не содержат значений, они не являются переменными.Их можно использовать в качестве ключа для переменной, хранящейся в хэше.

my_hash = {amount: 5, colour: 'blue'}

my_hash[:amount] == 5
=> true

Rails params, хотя и не совсем хэши, являются хеш-подобными структурами с парами ключ / значение.

0 голосов
/ 30 января 2019

Это не работает, из-за if :amount == 1 (Вы должны сделать if params[:amount] == 1).И, возможно, попробуйте что-то вроде

   def update
     @student = Student.find(params[:id])
     @student.increment!(:points, params[:amount])
     redirect_to '/pages/points'
   end

Поля формы, подобные этой, обеспечат отправку params [: amount] с выбранным значением

<%= form_for student do |f| %>
  <%= f.submit '+1', name: 'amount', value: 1 %>
  <%= f.submit '+2', name: 'amount', value: 2 %>
  <%= f.submit '+3', name: 'amount', value: 3 %>
<%= end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...