Money Rails Gem - 空值

时间:2015-06-14 05:58:33

标签: ruby-on-rails currency money-rails

我用Money-Rails gem将我的Rails 4应用程序的两个模型货币化。

一个称为参与者,另一个称为资助。这些模型中的每一个都嵌套在另一个模型中,称为Scope。范围属于项目。

协会是:

项目有一个范围;范围属于项目 范围有一个参与者,有一个资金;参与者和资金均属于范围。

Project接受Scope的嵌套属性。 Scope接受Participant和Funding的嵌套属性。

范围和项目控制器以及模型本身允许参与者和资金中每个相关属性的参数。范围的参数允许在范围和项目控制器中。

在我的项目表格中,我问了几个问题。该表单还具有属于它的每个模型的嵌套表单。在Scope范围内,我向用户提出两个布尔问题,即:你想要参与者吗?你想要资金吗?这些模型中的每一个都有关于参与成本和资金的后续问题(这些属性是货币化的)。

如果对这些问题的回答是正确的,那么我会将参与者或资助表格部分透露出去并询问他们想要多少钱。

我有两个问题:

第一个问题:非空违规 1.如果用户说他们确实想要参与者,但没有相关费用,那么参与者模型中的布尔问题询问参与是否涉及成本,我收到的错误是:

ERROR:  null value in column "participation_cost_pennies" violates not-null constraint
  1. 如果用户说他们不希望参与者回答范围表格中提出的问题,我会得到与上面1中相同的错误
  2. 第二个问题:如果我在货币化字段中保存金额,然后返回编辑项目表单,表单不会在货币化字段中显示已保存的金额 - 如果您不重新输入,我会得到一个错误说它不能为空。

    有谁知道如何:

    1. 在所有情况下,第一个问题都会消失,除非实际寻求参与成本;以及

    2. 通过显示返回编辑表单时保存的原始金额来修复第二个问题?我已经尝试插入:选中我的表单元素,但它没有做任何事情。

    3. 我的代码如下:

      在我的Scope表单中(嵌套在我的项目表单中):

         <%= f.simple_fields_for :scope do |s_all| %>
      
                <%= s_all.input :if_participant, :as => :boolean, :label => false, inline_label: 'Public participants or volunteers' %>
                <%= s_all.input :if_funding, :as => :boolean, :label => false, inline_label: 'Funding or expenses' %>
      

      如果这些字段的答案是真的,那么我会揭示资助参与者的部分表格(无论哪个是真的)。​​

      在我的参与者部分表格中,我有:

      <%= f.simple_fields_for :scope do |participants_s| %>
            <%= participants_s.simple_fields_for :participant do |par| %>
                  <%= f.label 'Are participants reimbursed for their costs?', :class => 'question-project' %>
                      <%= par.collection_radio_buttons :costs, [[true, ' Yes'], [false, ' No']], :first, :last, {:item_wrapper_class => 'fixradio'}, {:class => "response-project"} %>
                      <%= f.label 'What amount will you pay for participation costs?', :class => 'question-project' %>
               <%= par.select :participation_cost_currency,
                                       options_for_select(major_currencies(Money::Currency.table)), selected: :participation_cost_currency,
                                       label: false,
                                       prompt: "Select your costs currency" %>
      
                      <%= par.input :participation_cost, label: false, placeholder: 'Whole numbers only', selected: :participation_cost_pennies, :input_html => {:style => 'width: 250px; margin-top: 20px', class: 'response-project'} %>
      

2 个答案:

答案 0 :(得分:0)

对于第一个问题,您需要在迁移中为participation_cost_cents列设置默认值:

# in console
> rails g migration change_default_for_participation_cost_cents

# in migration file
class ChangeDefaultForParticipationCostCents < ActiveRecord::Migration

  def change
    change_column :participants, :participation_cost_cents, :integer, default: 0
  end

end

我不确定我是否会遵循第二个问题。也许你应该将问题分成两部分?

答案 1 :(得分:0)

Rails的聚会小组帮助我回答了这个问题。答案并不明显 - 特别是对于新人来说。

我的问题是我的数据库中有一个名为participation_cost的属性。然后Monetise尝试使用相同的名称创建一个方法,因为我的表中的属性失败了。对于其他人,您不需要数据库中的属性以及您想要货币化的字段的名称。

删除该属性(在我的情况下,参与_cost)解决了我的问题。