我正在尝试在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语句可以工作?谢谢!
答案 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 %>