我正在渲染Item的显示页面中的第一步:
<%= render "/wizards/step1" %>
@Trade_wizard在实例化@Trade的特殊模型中处理,然后从每个步骤连续继承验证:
module Wizard module Trade STEPS = %w(step1 step2 step3).freeze class Base include ActiveModel::Model attr_accessor :Trade delegate *::Trade.attribute_names.map { |attr| [attr,"#{attr}="] }.flatten,to: :Trade def initialize(Trade_attributes) @Trade = ::Trade.new(Trade_attributes) end end class Step1 < Base valIDates :Trade_requester_ID,:Trade_recipIEnt_ID,:wanted_item_ID,presence: true valIDates :shares,numericality: { only_integer: true,greater_than_or_equal_to: 0,less_than_or_equal_to: :max_shares } def max_shares @Trade.wanted_item.shares end end class Step2 < Step1 valIDates :collateral_item_ID,presence: true end class Step3 < Step2 valIDates :agreement,presence: true end endend
然后我的WizardsController在每一步上运行验证并保存对象:
class WizardsController < ApplicationController before_action :load_Trade_wizard,except: %i(valIDate_step) def valIDate_step current_step = params[:current_step] @Trade_wizard = wizard_Trade_for_step(current_step) @Trade_wizard.Trade.attributes = Trade_wizard_params session[:Trade_attributes] = @Trade_wizard.Trade.attributes if @Trade_wizard.valID? next_step = wizard_Trade_next_step(current_step) create and return unless next_step redirect_to action: next_step else render current_step end end def create if @Trade_wizard.Trade.save session[:Trade_attributes] = nil redirect_to root_path,notice: 'Trade succesfully created!' else redirect_to({ action: Wizard::Trade::STEPS.first },alert: 'There were a problem when creating the Trade.') end end private def load_Trade_wizard @Trade_wizard = wizard_Trade_for_step(action_name) end def wizard_Trade_next_step(step) Wizard::Trade::STEPS[Wizard::Trade::STEPS.index(step) + 1] end def wizard_Trade_for_step(step) raise InvalIDStep unless step.in?(Wizard::Trade::STEPS) "Wizard::Trade::#{step.camelize}".constantize.new(session[:Trade_attributes]) end def Trade_wizard_params params.require(:Trade_wizard).permit(:Trade_requester_ID,:collateral_item_ID,:shares,:agreement) end class InvalIDStep < StandardError; endend
在我的路线我有
resource :wizard do get :step1 get :step2 get :step3 post :valIDate_stepend
我通过此设置获得的错误是表单中的第一个参数不能包含nil或为空.我知道为什么会发生这种情况 – 我需要在ItemsController#show中定义@Trade_wizard,我还没有这样做,因为这只会导致我从WizardsController复制代码.我不需要任何人为我做我的工作,我只需要一个指针,指出我如何能够解决这个问题.
解决方法 控制器设计为独立的,它们不能相互依赖.这与视图不同,可能正如您所做的那样,可以通过部分重用和组合.如果您需要重用控制器中的行为(与一个控制器不同,取决于另一个控制器),您可以使用继承,或遵循Rails方式,concerns.
在这种情况下,我会在包含向导/ step1partial视图的任何控制器中设置@Trade_wizard变量.
总结以上是内存溢出为你收集整理的ruby-on-rails – 将多步骤表单向导的第一步渲染为另一个控制器的show动作中的部分步骤全部内容,希望文章能够帮你解决ruby-on-rails – 将多步骤表单向导的第一步渲染为另一个控制器的show动作中的部分步骤所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)