我有一个创建操作但我只希望创建操作在尝试创建的表单中创建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| %>
这个逻辑是否正确?
答案 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
使用表单,您将有多种选择:
- 使用sessions / cookies进行“中间”操作
- JS / Ajax
醇>
正如评论中所提到的,这是"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