2013-01-04 226 views
0

Ruby on Rails的新手,在验证时遇到了一些麻烦。基本上我有一个单独的文本字段,需要验证才能保留下一页。我之前曾经使用过验证,但是我在不考虑验证的情况下编写了此页(对于某些不合理的原因)。Ruby on Rails验证文本字段

这里是模型页面:

class Certificate 

include ActiveModel::Validations 
include ActiveModel::Conversion 
extend ActiveModel::Naming 

attr_accessor :lot, :part_number, :quality_selected, :include_l 

validates :lot, :part_number, :quality_selected, :presence => true 

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

def persisted? 

    false 
end 
end 

的观点:

<%= form_for @certificate, :url => '/lot/certificate_print' do |f| %> 

     <% if @certificate.errors.any? %> 

     <div id="error_explanation"> 

      <h2><%= pluralize(@certificate.errors.count, "error") %> prohibited this quality from being saved:</h2> 

      <ul> 

      <% @certificate.errors.full_messages.each do |msg| %> 

      <li><%= msg %></li> 

      <% end %> 

      </ul> 

     </div> 

     <% end %> 



    <div class="modal"> 

     <div class="dialog" style="height:380px;"> 

     <div class="wrapper"> 

      <h4>Prepare Certificate of Analysis</h4> 

      <p style="height:60px;overflow:hidden">Please enter 5 digit part number and select L* value if required by customer.</p> 

      <div class="form-container" style="background:#ffffff;"> 

      <div class="wrapper"> 

       <div class="group-field"> 

       <div class="field" style="margin:0 10px 0 0;min-width:120px;"> 

        <%= f.label :part_number, 'Part Number' %><br /> 

        <%= f.text_field :part_number, {:style => 'text-align:center;width:200px;'} %> 

       </div> 



       <div class="field" style="margin:34px 10px 0 17px;min-width:120px;"> 

        <%= check_box_tag 'certificate[include_l]' %> 

        <%= f.label :include_l, 'Include L*?' %> 

       </div> 

       </div> 

      </div> 

      <%= hidden_field_tag :certificate_quality_selected, params[:quality_to_include], { :name => 'certificate[quality_selected]' } %> 

      </div> 



      <div class="actions"> 

      <a href="#" class="back-link">Back</a>&nbsp;&nbsp;&nbsp;<%= button_tag 'Generate', :type => 'button', :id => 'print-button' %> 

      </div> 

     </div> 

     </div> 

    </div> 



    <% end %> 

我知道这是不是仪式,我只是不完全确定的办法,我应该从拿这里。如果任何人都可以阐明这一点,那将不胜感激。

编辑:这里是控制器,

class LotController < ApplicationController 

     before_filter :authenticate_user! 
     before_filter :check_permission 

     def certificate 

     @lots = Quality.lots.all.map { |l| [l.lot, l.lot] } 
     @certificate = Certificate.new 

     respond_to do |format| 
      format.html 
      format.js 
     end 
     end 

     def certificate_review 
     @qualities = Quality.find(params[:quality_to_include].split(','))   

     respond_to do |format| 
      format.html { render action: "certificate_review", :layout => false } 
     end 
     end   

     def certificate_print 
     @qualities = Quality.find(params[:certificate][:quality_selected].split(',')) 
     @quality_lots = Quality.group('lot').find_all_by_id(params[:certificate][:quality_selected].split(',')) 
     @quality_lots_list = @quality_lots.map(&:lot) 
     @certificate = Certificate.new(params[:certificate]) 
     @average_moisture = Quality.where('id IN (?)',@qualities).average(:last_moisture_value) 
     @average_viscosity = Quality.where('id IN (?)',@qualities).average(:last_viscosity_value) 
     @average_color_l = Quality.where('id IN (?)',@qualities).average(:last_color_l_value) 

     Quality.update_all('coa_printed = "true"', 'id IN (' + params[:certificate][:quality_selected] + ')') 

     respond_to do |format| 
      format.html { render action: "certificate_print", :layout => 'blank' } 
     end 
     end 

     def certificate_generate 
     @certificate = Certificate.new 

     respond_to do |format| 
      format.html { render action: "certificate_generate", :layout => false } 
     end 
     end 

     private 

     def check_permission #checks permissions for the reporting section 
      if current_user.labSupervisor? 
      #allow past 
      elsif !current_user.administrator? 
      flash[:alert] = 'Your account must have the Administrator roles to access Certificate functionality.'; 
      redirect_to '/' 
      end 
     end     
    end 

回答

2

所以,你有模型和视图。最后一部分通常是控制器。您需要:

  1. 在您呈现的形式操作,您需要分配给@certificate

    @certificate = Certificate.new

  2. 您需要将按钮类型更改为submit,目前它的button

  3. 在接收提交的表单的动作,你需要验证PARAMS

    @certificate = Certificate.new(params[:certificate])

    @certificate.valid?

您应根据验证结果下一步做什么决定。呈现先前的操作(以便您可以打印错误)或继续。

+0

添加控制器到帖子。我仔细阅读了本教程 - http://www.youtube.com/watch?v=azH9IFUvjb0,并尝试应用您所说的内容,但仍然无法使其工作,基于当前可见的代码我仍然想念那些东西?我在代码中看到的基本差异是视图中的一行<'= form_for @certificate,:url =>'/ lot/certificate_print'do | f | %>'。这些示例中的很多都将其显示为一个简单的非转发'form_for',因此 - <%= form_for(@certificate)do | f |'。当这样做的时候,它不仅无法工作,而且也无法做任何事情。 – zillaofthegods