0

因此,我一直在使用 Active 模型在 ruby​​ on rails (1.9.3) 中处理多步骤表单,同时遵循 railscast #217 和 #219 并且在验证时遇到问题,问题是即使属性字段是不为空它仍然会抛出错误

1 error prohibited this wizard from being saved:
Validationattr can't be blank

我不相信它应该保存,但这可能与错误有关。(我不能使用表单 gem,必须自己写)如果您需要更多信息,请告诉我,我很乐意提供。

我的控制器代码 - (contollers/awizard_controller.rb)

class AwizardController < ApplicationController

  def new
    # New Asset Wizard
    @wizard = Awizard.new(id: 1)
    # Set session variable as initial step
    session[:wizard_step] = @wizard.current_step
  end

  def update
    @wizard = Awizard.new(id: 1) unless !@wizard.nil?
    @wizard.current_step = session[:wizard_step] unless nil

    if @wizard.valid?
      if params[:back_button]
        @wizard.previous_step
      elsif @wizard.last_step?
        @wizard.save if @wizard.all_valid?
      else
        @wizard.next_step
      end
      session[:wizard_step] = @wizard.current_step
    end

    if @wizard.changed?
      render 'form'
    else
      @wizard.save
    end
  end

end

我的向导模型 - (models/awizard.rb)

 class Awizard < Wizard
 validates :validationattr, :presence => true
 attr_accessor :validationattr

  def steps
    %w[validate_schedule validate_assets save_assets]
  end

 end

我的向导模型 - (models/wizard.rb)

class Wizard
include ActiveModel::Validations
include ActiveModel::Conversion
include ActiveModel::Dirty
include ActiveModel::Naming

#This class is used to manage the wizard steps using ActiveModel (not ActiveRecord)

attr_accessor :id
attr_writer :current_step  #used to write to current step
define_attribute_methods [:current_step] #used for marking change

def initialize(attributes = {})
   attributes.each do |name, value|
     send("#{name}=", value)
   end
end

def current_step
  @current_step || steps.first
end

def steps
  %w[] 
end

def next_step
  current_step_will_change! #mark changed when moving stepped
  self.current_step = steps[steps.index(current_step)+1] unless last_step?
end

def previous_step
  current_step_will_change! #mark changed when moving stepped
  self.current_step = steps[steps.index(current_step)-1] unless first_step?
end

def first_step?
  current_step == steps.first
end

def last_step?
  current_step == steps.last
end

def all_valid?
  steps.all? do |step|
    self.current_step = step
    valid?
  end
end

def step(val)
  current_step_will_change!
  self.current_step = steps[val]
end

def persisted?
  self.id == 1
end

end

我的观点 - (/views/awizard/_form.html.erb)

<%=  content_for :awizard_form do%>
  <%= form_for(@wizard) do |f| %>
    <%= render "#{@wizard.current_step}_step", :f => f %>
    <%= f.submit "Previous", :name => "back_button" unless @wizard.first_step? %>
    <%= f.submit "Continue", :name => "step" unless @wizard.last_step? %>
  <% end %>
<% end %>

(/views/awizard/_step1.html.erb)

<div class="field">
  <%= f.label :validationattr %><br />
  <%= f.text_field :validationattr %>
</div>

(/views/awizard/_step2.html.erb)

<div class="field">
  <%= f.label 'Step2' %><br />
</div>

(/views/awizard/_step3.html.erb)

<div class="field">
  <%= f.label 'Step3' %><br />
</div>

路线代码

resources :awizard
4

2 回答 2

0

抛出错误是因为第 2 步中的 validationattr 属性为零。我不确定逻辑,您可能需要在后续帖子中包含它。

于 2013-01-10T22:31:48.793 回答
0

问题是正如Yoshiji 先生所说,没有将参数传递到步骤 2,validationattr 无法在向导中验证,在控制器中添加向导参数的合并解决了这个问题。

于 2013-01-11T01:42:46.463 回答