質問編集履歴

4

完成下の

2017/07/04 01:29

投稿

bouyomisan
bouyomisan

スコア87

test CHANGED
File without changes
test CHANGED
@@ -147,3 +147,33 @@
147
147
  times.has_key?("1")
148
148
 
149
149
  こうすればできました。が、汎用性も、拡張性も悪いのでもっとスマートな書き方が知りたいです!
150
+
151
+
152
+
153
+ ーーーーーーーーーーー最後の追記
154
+
155
+ 完成しました!みなさまありがとうございました!
156
+
157
+ 最後の ArgumentError はご覧の通り時間の入っている params に空のハッシュがあるからです。これは別のメソッドを使って取り除いています。
158
+
159
+
160
+
161
+ ```ruby
162
+
163
+ pry(#<EventsController>)> time = Array(params[:user][:note][:datetime])
164
+
165
+ => [<ActionController::Parameters {"(1i)"=>"2018", "(2i)"=>"3", "(3i)"=>"5", "(4i)"=>"03", "(5i)"=>"10"} permitted: false>,
166
+
167
+ <ActionController::Parameters {"(1i)"=>"", "(2i)"=>"", "(3i)"=>"", "(4i)"=>"", "(5i)"=>""} permitted: false>]
168
+
169
+
170
+
171
+ pry(#<EventsController>)> Array(params[:event][:invites][:datetime]).each {|t| p normalize_time t}
172
+
173
+ 2018-03-05 03:10:00 +0900
174
+
175
+ ArgumentError: argument out of range
176
+
177
+
178
+
179
+ ```

3

追記

2017/07/04 01:29

投稿

bouyomisan
bouyomisan

スコア87

test CHANGED
File without changes
test CHANGED
@@ -137,3 +137,13 @@
137
137
 
138
138
 
139
139
  他の方は length とか size を使った例を教えてくださっているのですが、Parameters クラスには定義されてないようで使えないんです。
140
+
141
+
142
+
143
+ ーーーーーーーーーーさらに追記
144
+
145
+ pamrams に 0 とか 1 が自動で追記されることを利用して、
146
+
147
+ times.has_key?("1")
148
+
149
+ こうすればできました。が、汎用性も、拡張性も悪いのでもっとスマートな書き方が知りたいです!

2

コード追記

2017/07/02 02:29

投稿

bouyomisan
bouyomisan

スコア87

test CHANGED
File without changes
test CHANGED
@@ -63,3 +63,77 @@
63
63
 
64
64
 
65
65
  ```
66
+
67
+
68
+
69
+ ーーーーーーーーーー追記
70
+
71
+
72
+
73
+
74
+
75
+ ```ruby
76
+
77
+ #日付を一つにした場合
78
+
79
+
80
+
81
+ [1] pry(#<UsersController>)> times.is_a?(Hash)
82
+
83
+ => false
84
+
85
+ [2] pry(#<UsersController>)> times.class
86
+
87
+ => ActionController::Parameters
88
+
89
+ [3] pry(#<UsersController>)> times
90
+
91
+ => <ActionController::Parameters {"0"=>{"(1i)"=>"2017", "(2i)"=>"6", "(3i)"=>"2", "(4i)"=>"00", "(5i)"=>"00"}, "1"=>{"(1i)"=>"", "(2i)"=>"", "(3i)"=>"", "(4i)"=>"", "(5i)"=>""}} permitted: false>
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+ #日付を2つにした場合
102
+
103
+
104
+
105
+
106
+
107
+ [5] pry(#<UsersController>)> times
108
+
109
+ => <ActionController::Parameters {
110
+
111
+ "0"=>
112
+
113
+ {"(1i)"=>"2018", "(2i)"=>"2", "(3i)"=>"1", "(4i)"=>"02",(5i)"=>"00"},
114
+
115
+
116
+
117
+ "1"=>{"(1i)"=>"2018", "(2i)"=>"1", "(3i)"=>"7", "(4i)"=>"01", "(5i)"=>"20"}} permitted: false>
118
+
119
+
120
+
121
+ [6] pry(#<UsersController>)> times.class
122
+
123
+ => ActionController::Parameters
124
+
125
+ [7] pry(#<UsersController>)> times.is_a?(Hash)
126
+
127
+ => false
128
+
129
+
130
+
131
+ ```
132
+
133
+
134
+
135
+ 変わらないですねー。どちらも Parameters というクラスになってます。あと関係あるかどうかわかりませんが、僕がform をいじってしまっているのもあって、paramas の中のキーに 0 とか 1 が紛れ込んでいるんです。
136
+
137
+
138
+
139
+ 他の方は length とか size を使った例を教えてくださっているのですが、Parameters クラスには定義されてないようで使えないんです。

1

コードの追記

2017/07/02 01:59

投稿

bouyomisan
bouyomisan

スコア87

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,65 @@
1
1
  入力欄が5つあるのですが、ユーザーは1つでも5つでも構わないという仕組みです。
2
2
 
3
3
  複数の時は each を使い分解して処理し、1つの時はそのまま処理をしたいのですが、複数か1つかを見分ける方法がわからず困っています。どのようにしたら判別することができますか?
4
+
5
+
6
+
7
+
8
+
9
+ これが追記のコードです。if times.instance_of?(Array) の箇所をどうにかしたいです。
10
+
11
+
12
+
13
+ ```
14
+
15
+ # instance_of?(Array) は必ず falseになってしまうため困っている
16
+
17
+ times = params[:user][:note][:datetime]
18
+
19
+
20
+
21
+ if times.instance_of?(Array)
22
+
23
+ times.each do |time|
24
+
25
+ if include_validate_time?(time)
26
+
27
+ @user.notes.create(user_id: user_id.to_i, datetime: normalize_time(time))
28
+
29
+ normalize_time(time)
30
+
31
+ end
32
+
33
+ end
34
+
35
+ else
36
+
37
+ if include_validate_time?(times["0"])
38
+
39
+ @user.notes.create(user_id: user_id.to_i, datetime: normalize_time(times["0"]))
40
+
41
+ end
42
+
43
+
44
+
45
+ # datetimeフィールドで送信すると変になるから一つにまとめるためのメソッド
46
+
47
+ def normalize_time(time)
48
+
49
+ y = time["(1i)"]
50
+
51
+ mo = time["(2i)"]
52
+
53
+ d = time["(3i)"]
54
+
55
+ h = time["(4i)"]
56
+
57
+ mi = time["(5i)"]
58
+
59
+ Time.new(y,mo,d,h,mi)
60
+
61
+ end
62
+
63
+
64
+
65
+ ```