mirror of
https://github.com/discourse/discourse.git
synced 2024-11-26 18:13:39 +08:00
DEV: Introduce an array
type for Chat contracts (#22278)
This small patch registers a new `ActiveModel` type: `array`. It will split a string on `,` to create a new array. If the value is already an array, nothing will happen and for all other types, it will wrap the value in an array. Here’s an example on an existing contract: ```ruby attribute :target_usernames before_validation do self.target_usernames = ( if target_usernames.is_a?(String) target_usernames.split(",") else target_usernames end ) end # can be rewritten as: attribute :target_usernames, :array ```
This commit is contained in:
parent
6517e6d47a
commit
885ab9a015
20
plugins/chat/lib/chat/types/array.rb
Normal file
20
plugins/chat/lib/chat/types/array.rb
Normal file
|
@ -0,0 +1,20 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Chat
|
||||
module Types
|
||||
class Array < ActiveModel::Type::Value
|
||||
def serializable?(_)
|
||||
false
|
||||
end
|
||||
|
||||
def cast_value(value)
|
||||
case value
|
||||
when String
|
||||
value.split(",")
|
||||
else
|
||||
::Array.wrap(value)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -496,6 +496,8 @@ after_initialize do
|
|||
)
|
||||
|
||||
register_bookmarkable(Chat::MessageBookmarkable)
|
||||
|
||||
ActiveModel::Type.register(:array, Chat::Types::Array)
|
||||
end
|
||||
|
||||
if Rails.env == "test"
|
||||
|
|
35
plugins/chat/spec/lib/chat/types/array_spec.rb
Normal file
35
plugins/chat/spec/lib/chat/types/array_spec.rb
Normal file
|
@ -0,0 +1,35 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "rails_helper"
|
||||
|
||||
RSpec.describe Chat::Types::Array do
|
||||
subject(:type) { described_class.new }
|
||||
|
||||
describe "#cast" do
|
||||
subject(:casted_value) { type.cast(value) }
|
||||
|
||||
context "when 'value' is a string" do
|
||||
let(:value) { "first,second,third" }
|
||||
|
||||
it "splits it" do
|
||||
expect(casted_value).to eq(%w[first second third])
|
||||
end
|
||||
end
|
||||
|
||||
context "when 'value' is an array" do
|
||||
let(:value) { %w[existing array] }
|
||||
|
||||
it "returns it" do
|
||||
expect(casted_value).to eq(value)
|
||||
end
|
||||
end
|
||||
|
||||
context "when 'value' is something else" do
|
||||
let(:value) { Time.current }
|
||||
|
||||
it "wraps it in a new array" do
|
||||
expect(casted_value).to eq([value])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue
Block a user