【问题标题】:Validate search form without model验证没有模型的搜索表单
【发布时间】:2016-08-27 08:32:58
【问题描述】:

在我看来 new.html.erb 中,我在 rails 中有这个表单

<%= form_for( @rent , html: { class: 'form-horizontal' }) do |f| %>
  <div class="form-group">
    <label for="" class="col-lg-2 col-md-3 col-sm-3 col-xs-3 control-label">year:</label>
    <div class="col-lg-3 col-md-3 col-sm-3 col-xs-3">
      <%= f.text_field :year, class: 'form-control' %>
    </div>

    <div class="col-lg-2 col-md-3 col-sm-3 col-xs-3">
      <%= f.submit 'Buscar', :class =>"btn btn-sm btn-info btn-flat" %>
    </div>
    <div class="clearfix"></div>
  </div>
<% end %>

<%= render 'shared/error_messages', object: @rent %>

在我的控制器中我有这个

class RentsController < ApplicationController
    def new
      @rent = RentSearch.new
    end

    private
      def search_params
        params.require(:year).permit(:year)
      end
end

在我的模型中,有这样的代码:

class RentSearch
    include ActiveModel::Validations
    include ActiveModel::Conversion
    extend ActiveModel::Naming

    attr_accessor :year

    validates :year, presence: true
    validates :year, length: { is: 4 }
end

使用这段代码我得到了这个错误

未定义的方法`持久化? #

但是我做了一些修改并没有显示错误,但是提交时没有显示任何错误并且表单为空,我不知道如何解决这个问题。

在没有模型访问数据库并将所有验证传递给控制器​​并验证的情况下,在 Rails 中创建表单的最佳方法是什么。

【问题讨论】:

  • 对不起,我是新人,但您的请求已完成

标签: ruby-on-rails forms ruby-on-rails-4


【解决方案1】:

我的解决方案

感谢@Зелёный 的帮助。

路由.rb

resources :rents, only: [:index, :new, :create]

rent.rb - 模型

class Rent
  # Validations
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :year

  validates :year, presence: true
  validates :year, length: { is: 4 }

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

  def persisted?
    false # which means this object persisted in the database.
  end
end

rents_controller.rb

class RentsController < ApplicationController

    def index
      @params = params
    end

    def new
      @rent = Rent.new
    end

    def create
      @rent = Rent.new( params['/rents'] )
      if @rent.valid?
        redirect_to tg_rents_path( year: params['/rents']['year'] )
      else
        render :action => 'new'
      end
    end

end

new.html.erb

<%= form_for( tg_rents_path , url: {action: "create"}, html: { class: 'form-horizontal' }) do |f| %>
    <div class="form-group">
      <label for="" class="col-lg-2 col-md-3 col-sm-3 col-xs-3 control-label">year:</label>
      <div class="col-lg-3 col-md-3 col-sm-3 col-xs-3">
        <%= f.text_field :year, class: 'form-control' %>
      </div>

      <div class="col-lg-2 col-md-3 col-sm-3 col-xs-3">
        <%= f.submit 'Search', :class =>"btn btn-sm btn-info btn-flat" %>
      </div>
      <div class="clearfix"></div>
    </div>
<% end %>

<%= render 'shared/error_messages', object: @rent %>

谢谢大家!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多