用于计算骰子卷的Ruby on Rails表单

时间:2015-11-05 02:34:05

标签: ruby-on-rails ruby-on-rails-4

我正在创建一个Web应用程序作为一个培训项目,它将采用三个输入(骰子数量,边数和卷数的整数值)并将其输入到一系列表格中,这将有助于计算和输出结果,以及历史数据的保存(过去的卷数。)

我被卡住了。

以下是表单的ERB:

<%= form_for(@run) do |f| %>
      How many dice: <%= f.number_field :die_count, :placeholder => "# of dice" %><br>
      How many sides: <%= f.number_field :die_sides, :placeholder => "# of sides" %><br>
      How many rolls: <%= f.number_field :rolls, :placeholder => "# of rolls" %><br>
      <%= f.submit "Roll!" %>
  <% end %>

这是我的模特:

  class Run < ActiveRecord::Base
  has_many :rolls
  belongs_to :user

  validates_presence_of :die_count, :rolls, :die_sides

  validates_numericality_of :die_count, :die_sides, :rolls

end

这是我的相关控制器信息:

  def new
    @run = Run.new
  end

  def create
    @run = Run.new(run_params)
  end

  private

  def run_params
    params.require(:run).permit(:die_count, :die_sides, :rolls)
  end

为了更好的衡量,这里是用于制作我的数据库表的迁移:

  class CreateRuns < ActiveRecord::Migration
  def change
    create_table :runs do |t|
      t.integer :die_count
      t.integer :die_sides
      t.integer :roll_count
      t.timestamps null: false
    end
  end
end

此时,我只想让它在Run模型中创建一条新记录。这是我输入5,5和5到number_fields并单击我的提交按钮时出现的错误:

The Roadblock

如果我正确读取这个,我的应用程序想要遍历各个数字,就像它们是数组一样,但它不能因为它们是字符串而不是。这让我感到困惑,因为它们首先不是字符串。它们是整数。

把头发拉出来。

2 个答案:

答案 0 :(得分:0)

我认为您的意思是在代码中的任何地方用rolls替换roll_count

How many rolls: <%= f.number_field :roll_count, :placeholder => "# of rolls" %><br>

validates_presence_of :die_count, :roll_count, :die_sides validates_numericality_of :die_count, :die_sides, :roll_count

def run_params params.require(:run).permit(:die_count, :die_sides, :roll_count) end

答案 1 :(得分:0)

:rolls是对另一个名为Roll的模型的引用(你创建了吗?)。 :roll_countRun模型的属性,用于定义卷数(在迁移表中可见)。

它们是两个非常不同的东西,尽管理论上:roll_count理论上应该等于Roll记录'拥有'的Run记录的数量。

在表单中,将:rolls替换为:roll_count。在控制器的run_params方法中执行相同操作。还有你模型中的两个验证。 (清单: 4 您需要修改该符号名称的地方)。

在您的控制器中,还要将create方法的内容更改为@run = Run.create(run_params)

已编辑(清晰度):Run.new(params)创建Run对象的新实例,但不会将其保存在数据库中。 Run.create(params)创建对象并保存。

最后,在你的模型中,注释掉has_many :rolls,直到你实际实现了Roll模型(没有双关语!);如果belongs_to :user模型未实现,则对User执行相同操作。

完成这些更改后,您的表单通常应该正常工作,数据应保存在runs数据库表中。