34122
お世話になります。多くの基本的なことを理解しないで  
自分のビジネスに関係したアプリをrailsで作って  
いるものです。アクションのコーディング中で同じ操作  
が結構あります。同じステップをいくつも記述するのはやはり  
余りに見苦しいし、無駄です。それでその部分をメソッドに  
するには、スコープの問題でやりにくい。あるいは  
引数があまりに数が大きくなりすぎる。オブジェクト化  
するほどでもないし、ちょっと大げさ過ぎます。このような  
コーディングの時、簡単に同じ部分だけを別の個所に記述  
して他のアクションとあるいは同じアクション内で共有する  
ことはできないでしょうか？  
VBAでは何か関数のオプションでできたような記憶が  
ありますが、rubyでは可能ですか？よろしくお願い  
します。

* * *

例えば次のようなステップがあるとします。

filea.field_a = ary[1]  
filea.field_b = ary[2]  
filea.field_c = ary[5]  
filea.field_d = ary[6].to_i  
・  
・  
・  
・  
・  
・

このコーディングは変えたくない,  
そして、数箇所繰り返して出現するとします。  
当然同じものをコーディングしたくありません。  
従って、どこか一か所に書いて共有して使えれば  
便利ですし、コーディングミスも防げます。

* * *

フィールド名は違うかも知れないが内容は殆んど  
同じです。renderで理解できないエラーが出たのと、  
newとeditのアクションはコンピューターで判断  
させた方がユーザーには親切だと思い、つまり  
入力でキーが重複したときは自動的にedit画面に  
導いた方がユーザは助かります。  
そしてrenderを使わないで、すべてredirect_toで入力ミスを返しているので  
アクション毎の入力データをすべてファイルで管理する  
必要が有り、配列データで各フィールの値を持っています。  
そして配列フィールドから最終的にマスターに登録します。  
確かに異常なコーディングかもしれません。でもひと昔の  
言語cobol等では簡単にできたものです。そして普通でした。
CC BY-SA 3.0
2017-04-18T00:15:07.770
34080
2017-04-21T23:57:44.503
2017-04-21T23:57:44.503
14412
14412
question
ruby-on-rails ruby
同じ処理ステップを別ルーティンとしてまとめることは可能？
例えば以下のようなメソッドではいかがでしょうか。

```

    # 定義
    def  set_file_field_with_ary(file, ary)
        file.field_a = ary[1]
        file.field_b = ary[2]
        file.field_c = ary[5]
        file.field_d = ary[6].to_i
    end
    
    # 使用
    set_file_field_with_ary(filea, ary)
    
```

* * *

参照渡しについての補足:

メソッドから変更対象のオブジェクト（`file`）を `return` していないのは、メソッドに渡されるのがオブジェクトの参照である事によります。  
つまり、上のメソッドはオブジェクトのコピーを操作しているのではなく、元のオブジェクトその物を変更しています。  
いわゆる「破壊的」メソッドです。

実行:

```

    ary[1] = "あいう"
    set_file_field_with_ary(filea, ary)
    puts "変数 filea の 'field_a' の値: #{filea.field_a}"
    
    ary[1] = "ABC"
    set_file_field_with_ary(filea, ary)
    puts "変数 filea の 'field_a' の値: #{filea.field_a}"
    
```

出力:

```

    変数 filea の 'field_a' の値: あいう
    変数 filea の 'field_a' の値: ABC
    
```

「Ruby 参照渡し」などのキーワードで検索すると、色々と解説があると思います。  
（もちろん、戻り値として返した方が都合がいい場合もありますし、それでもまったく構いません）
CC BY-SA 3.0
2017-04-19T08:59:23.997
34122
2017-04-20T10:12:27.933
2017-04-20T10:12:27.933
3054
3054
34080
answer