Ruby on rails 您可以在rails控制器上执行创建前操作吗

Ruby on rails 您可以在rails控制器上执行创建前操作吗,ruby-on-rails,model-view-controller,Ruby On Rails,Model View Controller,我有一个创建操作,但我只希望在表单中尝试创建的两个项为true时创建该创建操作。在完成create操作之前是否可以执行if语句,或者这是否使我的控制器过于臃肿 我有一个表格,我想提交给我的db,但基于表格中的一些问题,我希望表格在将表格信息放入db之前打开另一个页面(付款页面)。只有在充电成功后,如果充电成功,控制器才会将信息放入数据库 所以我想知道,在控制器中,是否有可能将执行创建操作的逻辑放在干巴巴的,甚至是可能的 --补充资料-- 所以我仍然在努力把这件事做好。。。 在我的表单控制器中,我

我有一个创建操作,但我只希望在表单中尝试创建的两个项为true时创建该创建操作。在完成create操作之前是否可以执行if语句,或者这是否使我的控制器过于臃肿

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

所以我想知道,在控制器中,是否有可能将执行创建操作的逻辑放在干巴巴的,甚至是可能的

--补充资料--

所以我仍然在努力把这件事做好。。。 在我的表单控制器中,我有

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| %>


此逻辑正确吗?

如果没有额外的表单,则应在您的模型中使用以下方法处理此问题:

#app/controllers/your_controller.rb
类YourController
在你的模型中

#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
#app/models/model.rb
类模型

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

  • 具有会话/cookie的“中间”操作
  • JS/Ajax
  • 正如评论中提到的,这是一个问题,即如何在整个过程中保持数据的完整性

    您应该检查一下如何处理这个问题-他们将用户发送到一个身份验证页面(在那里他们接收到令牌),然后被重定向回“确认”页面,他们可以从该页面继续

    -

    中介机构

    如果您有一个中间操作,您必须稍微更改您的流程:

    #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
    
    #config/routes.rb
    资源:controller do
    get:intermediate,on::collection
    结束
    #app/controllers/your_controller.rb
    类YourController
    这将非常有效,尽管这意味着拥有自定义路由和另一个操作

    -

    Ajax

    另一种方法是使用Ajax/JS

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

    支付视图将是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
    
    #app/assets/javascripts/application.js
    $(document).on(“submit”、“#uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuux”,函数()上{
    $.ajax({
    url:“控制器”,
    方法:“张贴”,
    数据:。。。。。。。
    成功:功能(数据){
    //显示付款页面
    }
    });
    });
    #app/controllers/your_controller.rb
    类YourController
    您能提供更多细节吗?不过,根据您所写的内容,这听起来像是属于模型或表单对象验证的应用程序逻辑。只是为了检查我是否正确理解您所需的行为:提交表单->检查属性
    :x
    :y
    ->如果两个属性都为True,则创建记录| els如果属性为False,呈现付款视图->提交付款单->创建付款记录并创建原始记录。如果不讨论这是如何发生的,这大概就是你想要发生的-对吗?很抱歉,实际上这是提交表单->检查属性:x->如果属性x为False,则创建记录| | Elsif Attr True->从属性:Y获取付款金额,呈现付款视图,显示属性为到期金额->提交付款表单->成功收费->创建原始记录该流程的棘手部分是,当用户执行另一个完整的“往返”来处理付款时,您需要保留一些状态(在本例中,了解原始表单提交的属性)(这可能由于任何原因而失败)。所以这不是你可以在控制器中轻松处理的事情——你需要把这些原始属性踢到数据库中,以保存它们的请求。考虑创建一个“原始的东西”。数据库记录的
    :paid
    列是否设置为
    false
    ,然后分别处理付款流。我一直在保留关于“这可以在控制器中完成”的原始问题的反馈,但在我建议使用Javascript之前,有很多方法可以在Rails中实现这一点。这与JS本身无关-在Rails“层”中保持这样的流更容易(而不是开始涉及客户端逻辑和交互)这是我建议的方向。如果不了解Rails应用程序的现有移动部分,就很难深入了解它。好的,谢谢你,里奇。我正在尝试实现这一点,但要确保我理解你的意思。中间操作是否真的在表单到达最终目的地之前将表单发送到另一条路径?那么我的表单是否应该不受影响提交给中介机构?如果我的视图显示类似于
    true do | f |%>
    的内容,那么在我的收费控制器上,它将提交给最初预期的真实表单?您需要为@object,url:[intermediar]使用
    form_
    
    #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