Guest User

Untitled

a guest
Oct 23rd, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.52 KB | None | 0 0
  1. ```ruby
  2. require 'dry-validation'
  3. require 'dry-struct'
  4. require 'active_model/errors'
  5.  
  6. require_relative '../create_study'
  7.  
  8. module MyApp
  9. module Types
  10. include Dry::Types.module
  11. end
  12.  
  13. class CreateStudy
  14. class Form < Dry::Struct
  15. transform_keys(&:to_sym)
  16.  
  17. attribute :title, Types::String.meta(omittable: true)
  18. attribute :oid, Types::String.meta(omittable: true)
  19.  
  20. # ActiveModel
  21. def persisted?
  22. false
  23. end
  24.  
  25. # ActiveModel
  26. def model_name
  27. Struct.new(:param_key, :name).new('form', 'form')
  28. end
  29.  
  30. # ActiveModel
  31. def to_key
  32. nil
  33. end
  34.  
  35. def errors
  36. @errors ||= ActiveModel::Errors.new(self)
  37. end
  38.  
  39. def valid?
  40. validate
  41. @validation.success?
  42. end
  43.  
  44. private
  45.  
  46. def schema
  47. Dry::Validation.Schema do
  48. required(:name).filled
  49. end
  50. end
  51.  
  52. def validate
  53. unless defined?(@validation)
  54. @validation = schema.call(attributes)
  55. @validation.messages.each do |field, field_errors|
  56. field_errors.each do |field_error|
  57. errors.add(field, field_error)
  58. end
  59. end
  60. end
  61.  
  62. self
  63. end
  64. end
  65. end
  66. end
  67.  
  68. form = MyApp::CreateStudy::Form.new
  69. form.valid? # => false
  70.  
  71. form = MyApp::CreateStudy::Form.new(title: 'Yellow')
  72. form.valid? # => true
  73. ```
  74.  
  75. We could remove any dependency on `ActiveModel` by implementing our own errors object which ducktypes as `ActiveModel::Errors`.
Add Comment
Please, Sign In to add comment