【问题标题】:Ruby on Rails validating text fieldRuby on Rails 验证文本字段
【发布时间】:2012-12-19 01:55:32
【问题描述】:

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

【问题讨论】:

    标签: html ruby-on-rails ruby validation model-view-controller


    【解决方案1】:

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

    1. 在渲染表单的动作中,需要赋值给@certificate

      @certificate = Certificate.new

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

    3. 在接收提交表单的action中,需要验证params

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

      @certificate.valid?

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

    【讨论】:

    • 在帖子中添加了控制器。我浏览了本教程 - youtube.com/watch?v=azH9IFUvjb0 并尝试应用你所说的,我似乎仍然无法让它工作,基于当前可见的代码,我仍然缺少那些东西吗?我在代码中看到的根本区别是视图&lt;%= form_for @certificate, :url =&gt; '/lot/certificate_print' do |f| %&gt; 的第一行。很多这些示例都将其显示为简单的非转发 form_for 本身 - &lt;%= form_for (@certificate) do |f|。这样做的时候,不仅不起作用,而且什么都做不了。
    猜你喜欢
    • 2016-08-04
    • 2011-05-09
    • 1970-01-01
    • 2012-06-21
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多