Skip to content

Instantly share code, notes, and snippets.

@ta1kt0me
Last active July 30, 2018 14:56
Show Gist options
  • Select an option

  • Save ta1kt0me/c8532fdb165a9528f421f141bec2b3bf to your computer and use it in GitHub Desktop.

Select an option

Save ta1kt0me/c8532fdb165a9528f421f141bec2b3bf to your computer and use it in GitHub Desktop.
`on`で指定したcontextの時にだけ、html5 validationを有効にしたいケースのサンプルコード
require "bundler/inline"
gemfile do
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem "rails"
gem "html5_validators"
gem "sqlite3"
end
require "action_controller/railtie"
class TaskApp < Rails::Application
Rails.logger = Logger.new $stdout
secrets.secret_key_base = "secret_key_base"
config.eager_load = false
initialize!
routes.draw do
resources :tasks, only: [:new, :create, :edit, :update]
end
end
require "active_record"
ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
ActiveRecord::Schema.define do
create_table :tasks, force: true do |t|
t.string :name
t.text :memo
end
end
class Task < ActiveRecord::Base
validates :name, presence: true
validates :memo, presence: true, on: :update
end
class TasksController < ActionController::Base
TEMPLATE =<<~ERB
<%= form_for @task do |f| %>
<%= f.text_field :name %>
<%= f.text_area :memo %>
<% end %>
ERB
def new
@task = Task.new
render inline: TEMPLATE
end
def edit
@task = Task.find(params[:id])
render inline: TEMPLATE
end
end
require "minitest/autorun"
require "rack/test"
class TasksTest < Minitest::Test
include Rack::Test::Methods
def test_only_add_required_attribute_on_create
get "/tasks/new"
assert_match %r{<input required="required" type="text" name="task\[name\]" id="task_name" />}, last_response.body
# 現在は `<textarea required="required" name="task[memo]" ...` と、updateのcontextだけで有効にしたいケース以外でもhtml5 validationsが有効になる
assert_match %r{<textarea name="task\[memo\]" id="task_memo">\n</textarea>}, last_response.body
end
def test_only_add_required_attribute_on_update
Task.create name: "foo"
get "/tasks/1/edit"
assert_match %r{<input required="required" type="text" value="foo" name="task\[name\]" id="task_name" />}, last_response.body
assert_match %r{<textarea required="required" name="task\[memo\]" id="task_memo">\n</textarea>}, last_response.body
end
private
def app
TaskApp
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment