26543


DBとは関係なく、form_tagで入直値をもらい、getでその値をコントローラに渡すようにしています。  
ここで入力フォームにバリデーションをかけたいんですけど、DBを利用しなくてもモデルを作成し、そこでバリデーションをかけるんでしょうか。  
方法がありましたらモデル、コントローラ、ヴューにどう作成すればいいか教えていただきたいんです。  
ちなみに自分がやっているところはRails Engineで作られています。

下記は自分のコードです。

view

[code]

    = form_tag(history_histories_path, method: 'get') do
      = label_tag :名前
      = text_field_tag :name
      br
      = submit_tag '検索する'
      br
    
[/code]

controller

[code]

    def index
    end
    
    def history
      @name = params[:name] 
    
       ... 省略　...
    end
    
[/code]

routes

[code]

    Admin::Engine.routes.draw do
      controller :application do
        resources :histories, only: [:index] do
          get :history, on: :collection
        end
      end
    end
    
[/code]


CC BY-SA 3.0
2016-06-07T10:18:22.177
26541
2016-06-08T05:41:05.453
10710
question
ruby-on-rails
railsでform_tagを使うとき、モデルでバリデーションをかける方法。


ActiveModel を利用すると、データベースに関連づけないモデルも ActiveRecord
と同様の枠組みでデータを取り扱うことができます。Controller/View は ActiveRecord を利用する場合と同様に作成してください。

app/models/application_form.rb:

[code]

    class ApplicationForm
      include ActiveModel::Model
    
      attr_accessor :name
      attr_accessor :age
    
      validates :name, :presence => true, :length => (1..10)
      validates :age, :numericality => true
    end
    
[/code]

実行結果:

[code]

    af = ApplicationForm.new(:name => "foo", :age => 100)
    af.valid?
    # => true
    
    af = ApplicationForm.new(:name => "", :age => 100)
    af.valid?
    # => false
    
    af = ApplicationForm.new(:name => "foo", :age => "bar")
    af.valid?
    # => false
    
[/code]

**追記**

エラーメッセージは ActiveRecord の場合と同様に取得できます。

[code]

    af = ApplicationForm.new(:name => "", :age => 100)
    af.valid?
    # => false
    af.errors
    # => #<ActiveModel::Errors>
    af.errors.messages
    # => {:name=>["can't be blank", "is too short (minimum is 1 character)"]}
    af.errors.full_messages
    # => ["Name can't be blank", "Name is too short (minimum is 1 character)"]
    af.errors.full_messages_for(:name)
    # => ["Name can't be blank", "Name is too short (minimum is 1 character)"]
    
[/code]


CC BY-SA 3.0
2016-06-07T11:23:05.383
26543
2016-06-08T05:41:05.453
2016-06-08T05:41:05.453
76
76
26541
answer