Ruby 初心者スレッド Part 67 (729レス)
1-

207: (アウアウウー Sa47-565v) 2021/06/23(水)23:47 ID:vtN99wcma(1) AAS
ライブラリのopenのように、
open() do |f|
・・・
end

と書いてもよく、

f= open()
・・・
f.close

と書いてもいいというクラスor メソッドは
どうやって作ればいいのでしょうか。
省2
208
(1): (ワッチョイ 5a01-QZnr) 2021/06/24(木)00:15 ID:PG/lAwcj0(1/2) AAS
if block_given? で分岐
209: (ワッチョイ 3bbb-565v) 2021/06/24(木)07:40 ID:R0/fGgxp0(1/2) AAS
>>208
ありがとうございます。
うまく作れました。
210
(3): (ワッチョイ 3bbb-565v) 2021/06/24(木)07:56 ID:R0/fGgxp0(2/2) AAS
すみません、もう一つ教えて下さい。
rubyというかプログラムを書くとき全般の注意として、
ファイルopenとcloseはなるべく近くに書くようにと
ありました。
恐らくclose漏れを警戒しているのだと思います。

yieldを使えば、以下コードでそれを実現できます。

def fileInterface
f= open()
begin
yield f
省17
211: (ワッチョイ db33-l/cN) 2021/06/24(木)09:32 ID:+4IsK47J0(1/2) AAS
>>210
大量の処理を関数にして分離。
あるいは、しょせん理想でしかないので、離れていても気にしない。
212: (ワッチョイ a75f-5d62) 2021/06/24(木)10:36 ID:5MDZvZ/d0(1) AAS
>>210
close漏れを警戒するのであれば、openにそのままブロックを渡した方がいい
openはブロックの実行結果を返し、ブロック脱出時に勝手にcloseします

まぁ、どうせclose漏れしてもそのうちGCに回収されるかプロセス終了時にcloseされる
213: (ワッチョイ 5a01-QZnr) 2021/06/24(木)11:01 ID:PG/lAwcj0(2/2) AAS
>>210
yield使った実装とやることは同じ

f= open file
begin
大量の処理を含むメソッド f # <― yieldがメソッドに変わるだけ
ensure
f.close
end

同じだからこそ毎回同じことを書かなくてもいいようblock付きで呼び出す
open(file){|f| 大量の処理を含むメソッド f}
214
(1): (アウアウウー Sa47-565v) 2021/06/24(木)12:31 ID:9bIzV4XCa(1) AAS
大量の処理を手続きオブジェクトに分離するのは、やりました。
やっぱりそれしかないかな。

ブロック付きで渡すのはオブジェクト指向ではない
コードになりやすく、今回は考えてないです。

また、全体をensureで囲うのは、
さすがにensure対象が暗黙的すぎてちょっとな・・・です。
215: (ワッチョイ db33-l/cN) 2021/06/24(木)13:25 ID:+4IsK47J0(2/2) AAS
>>214
> ブロック付きで渡すのはオブジェクト指向ではない
> コードになりやすく

そうか?
まあ、「オブジェクト指向」にもいろいろあるからな。w
216
(1): (ワッチョイ 0d01-++Tn) 2021/07/17(土)09:58 ID:yHV+uNLK0(1) AAS
railsにおいて あるフォームから特定の変数に送られるデータの内容を固定したいのですがなにかいい方法ありますか?

具体的には
<%= form_with model: @hoge do |form|%>
<%= form.text_field :name , value: 'hoge'%>
<%= form.submit %>
<% end %>
と書かれている場合 hogeというモデルのnameという変数に必ずhogeが入るようにしたいのですが上の書き方だと初期値にhogeが入るだけで編集可能になってしまいます。
217
(1): (ワッチョイ 552c-0PSu) 2021/07/17(土)10:48 ID:xmQE+uIu0(1/5) AAS
openに、ブロックを渡す方法は、
コンテキスト・マネージャーという、多くの言語で使われているデザインパターン

これよりも良いものは作れないから、皆が使っている
218: (ワッチョイ 552c-0PSu) 2021/07/17(土)10:54 ID:xmQE+uIu0(2/5) AAS
そりゃ、フォームはサーバーへ送られて更新されるものだから、
変更可能のフィールドが普通

変更不可のフィールドにするなら、
そのフィールドをサーバーへ送らないようにしないといけない

そういうオプションがあるのかな?
219: 218 (ワッチョイ 552c-0PSu) 2021/07/17(土)11:08 ID:xmQE+uIu0(3/5) AAS
「html disabled readonly」で検索!

HTML の <input> 要素には disabled と readonly 属性が存在します

disabled : コントロールが無効化され、フォームを Submit しても、値の送信が行われない

readonly : 値の変更は行えないが、コントロールは有効なので、
フォームを Submit すれば値の送信が行われる
220: 218 (ワッチョイ 552c-0PSu) 2021/07/17(土)11:15 ID:xmQE+uIu0(4/5) AAS
変更不可のフィールドなら、

<input> 要素などを使わずに、単にテキストを表示すれば?
221
(1): (ワッチョイ 615f-SRm2) 2021/07/17(土)13:56 ID:EBHVYdQH0(1) AAS
>>216
hidden_field使ってもいいけど
そもそもformによる入力=webからの入力は信頼してはいけない
222
(2): (ワッチョイ 9dbb-yayT) 2021/07/17(土)14:27 ID:7kNL/q5q0(1) AAS
>>221
ではどうすればいいでしょうか
223: (ワッチョイ da33-FmTf) 2021/07/17(土)16:20 ID:CYR4F+Ue0(1) AAS
>>222
直にソースで書くしか!

ちなみに、XSRFも調べとくとええんちゃう?
224: 218 (ワッチョイ 552c-0PSu) 2021/07/17(土)20:48 ID:xmQE+uIu0(5/5) AAS
マスアサインメント脆弱性を、strong parameters で防ぐ。
更新できる列を、permit で限定する。
これは、コントローラーでの制限

params.require(:person).permit(:name, :age)

Action Controller の概要
外部リンク[html]:railsguides.jp

モデルでのバリデは、

Active Record バリデーション
外部リンク[html]:railsguides.jp
省3
225: (ワッチョイ 9dbb-yayT) 2021/07/18(日)01:26 ID:M+6J3Mfd0(1) AAS
>>217
ブロックで書くとテストコードが書きづらくないですか?

最近はテストコードのことを考えて、普通に、
file = open(file,'r')
とか書いてます。

あと、ブロックはネストするからなあ。
226: (ワッチョイ 615f-SRm2) 2021/07/18(日)15:19 ID:WDHzAXg40(1) AAS
>>222
何がしたいのか次第
'hoge'で固定するのであればformで入力させる必要はないですし
なんらかの方法で生成するのであれば生成するタイミングを考えます
入力フォーム表示前に生成し固定する必要があるのであれば
ActiveSupport::MessageVerifier
ActiveSupport::MessageEncrypter
session
などを使う
1-
あと 503 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.011s