你可以在rails控制器

时间:2015-10-21 22:56:19

标签: ruby-on-rails model-view-controller

我有一个创建操作但我只希望创建操作在尝试创建的表单中创建IF 2项是真的。可以在完成创建操作之前执行if语句,还是让我的控制器太胖?

我有一个表单,我想提交给我的数据库,但根据表单中的一些问题,我希望表单显示另一个页面(付款页面)之前将表单信息放入数据库。只有在充电成功后,如果充电完成,控制器才会将信息放入数据库中。

所以我想知道DRY甚至是否可能在控制器中放置创建操作之前的逻辑?

- 补充资料 -

所以我仍然试图做到这一点...... 在我的表单控制器中我有

def intermediary
  if @model.who_pays == true
    @amount = @model.how_much_to_pay
    redirect_to charge_path, :notice => "Please make payment before proceeding"
  else
    redirect_to model_path #to create object
  end
end

然后以我的实际形式

Model.new

但我将其更改为

<%= form_for [@model, url: [intermediary_path]] do |f| %>

这个逻辑是否正确?

1 个答案:

答案 0 :(得分:2)

如果没有额外的表单,则应在您的模型中使用validations处理:

#app/controllers/your_controller.rb
class YourController < ApplicationController
   def new
      @model = Model.new
   end

   def create
      @model = Model.new model_params
      @model.save
   end
end

在你的模特中......

#app/models/model.rb
class Model < ActiveRecord::Base
   validate :true_questions, on: :create

   private

   def true_questions
      errors.add(:option1, "Must be true") unless option1
      errors.add(:option2, "Must be true") unless option2
   end   
end

使用表单,您将有多种选择:

  
      
  1. 使用sessions / cookies进行“中间”操作
  2.   
  3. JS / Ajax
  4.   

正如评论中所提到的,这是"state"的问题 - IE如何在整个过程中保持数据的完整性。

你应该查看stripe如何处理这个问题 - 他们将用户发送到身份验证页面(他们收到令牌),然后重定向回“确认”页面,他们可以从中继续进行。

-

<强>中介

如果您有中间行动,则必须稍微更改一下流量:

#config/routes.rb
resources :controller do
   get :intermediary, on: :collection
end

#app/controllers/your_controller.rb
class YourController < ApplicationController
   def intermediary
      # perform validations in the controller
      # set instance or session vars if necessary
      # render payment page
   end
   def create
      # returned from payment system - input into DB
   end
end

虽然这意味着拥有自定义路线和其他行动,但效果会很好。

-

<强>的Ajax

另一种方法是使用Ajax / JS。

这可以通过将数据发送到您的应用程序(可能是您的“创建”操作)并定义了某些开关来实现。这些将使您能够在调用付款视图之前执行所需的验证。

付款视图将是Ajax的来源:

#app/assets/javascripts/application.js
$(document).on("submit", "#____", function(){
   $.ajax({
      url: "controller",
      method: "POST",
      data: .......
      success: function(data){
         // show payment page
      }
   });
});

#app/controllers/your_controller.rb
class YourController < ApplicationController
   def create
      if params[:x] 
          # perform validation
          # return payment form
      else
          # capture payment data
          # save to db
      end
   end
end