Rails-使用增量!通过用户输入

时间:2019-01-29 22:13:01

标签: ruby-on-rails

我正在尝试在Rails应用中为学生用户分配分数。他们有一个称为:points的参数。我想根据老师用户的输入来更新他们的分数-他们可以给他们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语句,并包含了隐藏字段来更新:amount参数:

       <%= 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分,这意味着:amount在隐藏字段中没有更新。我会以错误的方式处理吗?有没有更好的方法来使用增量!更改点的值,还是有一种不同的方法来更新:amount,所以我的if语句可以工作?谢谢!

2 个答案:

答案 0 :(得分:1)

您可以通过一个表单并检查按下了哪个提交按钮来简化此操作。

<%= 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尽管不是完全散列,但是具有键/值对的类似hash的结构。

答案 1 :(得分:0)

由于if :amount == 1( 您应该执行if params[:amount] == 1)。 并且可能尝试类似

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

这样的表单字段将为发送参数[: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 %>