有条件的声明协助和重构Rails

时间:2016-11-04 09:08:54

标签: ruby-on-rails conditional ruby-on-rails-5

我正在开发一个集成了比特币API的应用程序,我正在努力处理条件语句,我认为这是由于我对ActiveRecord或SQL方法缺乏了解。

这是理想的行为:

  1. 调用API并生成并保存比特币地址。
  2. 在向用户付款之前,需要向用户显示相同的比特币地址。
  3. 一旦付款并且用户想要再付款,就需要再次调用API以生成新的比特币地址。
  4. 我找到了find_or_create方法,但我不确定如何在我的实现中使用它或使用哪种方法来说“如果它不存在 - 那就这样做”

    到目前为止,如果已经存在Payment,我的代码可以使用,但如果没有现有Payment,我会得到无效或未知的方法/变量错误。

      

    如果付款存在且最后一笔付款金额为0.0或零,则只显示最后付款的现有比特币地址。

    if Payment.exists?
     Payment.last.amount.to_f == 0.0 && Payment.last.amount == nil
     @last_address = Payment.last.btc
     @last_address
    
      

    如果付款大于0.0,则生成并保存新的比特币地址。

    elsif Payment.present?
     Payment.last.amount.to_f > 0.0
     @new_address = BlockIo.get_new_address
     Payment.create( btc: @new_address['data']['address'] )
      respond_to do |format|
       format.html { redirect_to '/save_btc'}
      end
    
      

    否则只需生成并保存一个新的比特币地址。

    else
    @new_address = BlockIo.get_new_address
    Payment.create( btc: @new_address['data']['address'] )
     respond_to do |format|
      format.html { redirect_to '/save_btc'}
     end
    end
    

    如何重构此代码,以及如何使用find_or_create或者如果记录不存在,则通过调用API创建新记录?

    用户不需要在视图中执行任何操作,因为一旦他们单击Pay,就会调用运行上述方法的页面。这是我的路线,它运作良好:

    match '/save_btc' => 'payments#create', via: [:get, :post]
    

    非常感谢任何帮助或评论。提前谢谢。

    编辑:当没有现有付款时,我收到以下错误:

    NoMethodError - undefined method `amount' for nil:NilClass:
    

    哪个显示与elsif行有关:Payment.last.amount.to_f > 0.0

    NoMethodError - undefined method金额为nil:NilClass:   app / controllers / payments_controller.rb:17:in create' actionpack (5.0.0.1) lib/action_controller/metal/basic_implicit_render.rb:4:in send_action'   actionpack(5.0.0.1)lib / abstract_controller / base.rb:188:in process_action' actionpack (5.0.0.1) lib/action_controller/metal/rendering.rb:30:in process_action'   actionpack(5.0.0.1)lib / abstract_controller / callbacks.rb:20:in block in process_action' activesupport (5.0.0.1) lib/active_support/callbacks.rb:126:in call'   activesupport(5.0.0.1)lib / active_support / callbacks.rb:126:在call' activesupport (5.0.0.1) lib/active_support/callbacks.rb:506:in块(编译中的2个级别)中   activesupport(5.0.0.1)lib / active_support / callbacks.rb:455:in call' activesupport (5.0.0.1) lib/active_support/callbacks.rb:455:in call'   activesupport(5.0.0.1)lib / active_support / callbacks.rb:101:in __run_callbacks__' activesupport (5.0.0.1) lib/active_support/callbacks.rb:750:in _ run_process_action_callbacks'   activesupport(5.0.0.1)lib / active_support / callbacks.rb:90:in run_callbacks' actionpack (5.0.0.1) lib/abstract_controller/callbacks.rb:19:in process_action'   actionpack(5.0.0.1)lib / action_controller / metal / rescue.rb:20:在process_action中的process_action' actionpack (5.0.0.1) lib/action_controller/metal/instrumentation.rb:32:in块中   activesupport(5.0.0.1)lib / active_support / notifications.rb:164:in block in instrument'

1 个答案:

答案 0 :(得分:0)

我设法在没有付款的情况下让代码工作,在if块中我做了:

if Payment.exists? && Payment.last.amount.to_f == 0.0 || Payment.exists? && Payment.last.amount == nil

elsif阻止我只需将Payment.present?更改为Payment.exists?

这个解决方案对我来说仍然非常讨厌,如果有更好的方法请评论。