ruby-on-rails – 将多步骤表单向导的第一步渲染为另一个控制器的show动作中的部分步骤

ruby-on-rails – 将多步骤表单向导的第一步渲染为另一个控制器的show动作中的部分步骤,第1张

概述我想为@trade_wizard(它有自己的控制器,WizardsController)渲染多步形式的第一步作为部分内部ItemsController#show,但我不知道如何构建它而不将代码从一个控制器加倍到其他. 我正在渲染Item的显示页面中的第一步: <%= render "/wizards/step1" %> @trade_wizard在实例化@trade的特殊模型中处理,然后从每个步骤 我想为@Trade_wizard(它有自己的控制器,WizardsController)渲染多步形式的第一步作为部分内部ItemsController#show,但我不知道如何构建它而不将代码从一个控制器加倍到其他.

我正在渲染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动作中的部分步骤所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1292481.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存