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