質問: ### 前提・実現したいこと 今回、ruby on railsを利用したWebアプリケーションを作ることになりました。 ◆前提: "teratail-server"という外部サーバ内に多数のテキストファイルが保存されているとする。 ◆実現したい事: このWebアプリケーションのユーザは"teratail-server"サーバ内にある多々あるファイル群の中から、 一つのテキストファイルを選択して、"ある処理"を施したい。 (今回はファイルの格納先を”http://teratail-server/2016/06/08/18-33-34/testdata.txt”とします。 "ある処理"はA/Bの2種類存在し、railsのコントローラ内で実装します)) ### Webアプリケーションのユーザーに操作させるフロー ◆フロー1:テキストボックスにログファイルの格納先urlを入力させる (つまりテキストボックスには”http://teratail-server/2016/06/08/18-33-34/testdata.txt”が入力される事になる) ◆フロー2:テキスト解析時に使用する"ある処理"(今回は"ある処理A"/"ある処理B"とする)をユーザに選択させる ユーザの選択肢としては、 ・「ある処理A」のみ選択 ・「ある処理B」のみ選択 ・「ある処理A/ある処理B」両方選択 の3択(つまり、ある処理A/Bどっちも選ばないという選択肢は無い) ◆フロー3:"解析開始"ボタンをユーザーに押下させる。 ### 現時点のソースコード(まだHTML側のみですが。。。) ”app/views/analyzes/_anlyzes.html.erb”とする。 フロー1:解析対象ログの指定 teratail-serverにアップされているログについては格納先Urlを入力してください。 teratail-serverのログURL入力: フロー2:テキストファイル解析に使用するある処理の指定 チェックボックスにチェックをいれてください ある処理A <%= check_box_tag :script_a_check %> <%= label_tag :script_a_check, 'ある処理A' %> ある処理B <%= check_box_tag :script_b_check %> <%= label_tag :script_b_check, 'ある処理B' %> フロー3:解析開始ボタンを押してください <%= button_tag( class: "btn btn-default btn-sm") do %> <%= content_tag :span, "解析開始", class: "glyphicon glyphicon-star", action: "analyze_log"%> <% end %> ### 現時点の状況 rails serverを実行すると、画面上は フロー1のテキストボックス フロー2の"ある処理A"、"ある処理B"のチェックボックス フロー3の解析開始ボタン がブラウザ上ではとりあえず表示されている事は確認できています。 ですが、Controller側がまだ未実装なのでフロー3の"解析開始"ボタンを押下してもだんまりです。 (そりゃそうだ) ### 質問事項 Controllerにて実装したい処理としては フロー3の"解析開始"ボタンが押下されたら ・フロー1のテキストボックスに書かれているファイル格納先にアクセスしてファイルを取得する ・フロー2の"ある処理A/B"各々のチェックボックスにチェックがついているかの確認する で、チェックがついている"ある処理"を実行する という処理となります。 その場合”app/views/analyzes/_anlyzes.html.erb”にも併せて手を入れる事になると思います。 ★★質問1★★:今後の事を考えると、そもそも上記のhtml.erbの実装で問題ないかを知りたいです。 「こんな実装だとControllerの実装面倒臭くない?」とか「こうしたらControllerの実装が楽になるよ」といったアドバイスをいただきたいです。 ★★質問2★★:上記の"ある処理"はすでにruby単体としては実装済みで動作検証済みです。 ruby on rails用に移植する場合はControllerフォルダ以下の任意のrbファイルに実装を移植すべきでしょうか?それとも他に適切な場所がありますでしょうか?(実はmodelに置いた方がよいとかlibに置いた方が良いとか) ### 補足情報(言語/FW/ツール等のバージョンなど) ・Railsは4.2.1を使用しています ・rubyは2.2.4を使用しています 質問者のレベル: rubyは1000ステップ程度のコードであれば、不明点はgoogle先生に多少頼りながらも自力で楽しんで書けます。一方、html/cssはおろかruby on rails自体も初心者です。
回答: URL設計とかの突っ込みは抜きにして(システム全体の話になるので)、 まず、viewのformの中に、最後のbutton_tagまでを入れてください。 そうすれば、受け取りアクションで途中のcheck_box_tagの中身が受け取れるようになります。 次に、controllerのアクションとフォームをつなげます。 たとえば、AnalyzesControllerのdownloadlogアクションであれば、formではなく、form_tagで実装します。 ``` # app/views/analyzes/_anlyzes.html.erb # routes.rbでパスが設定されている前提 <%= form_tag downloadlog_analyzes_path method: :put do %> teratail-serverのログURL入力: フロー2:テキストファイル解析に使用するある処理の指定 <%= check_box_tag :script_a_check %> <%= label_tag :script_a_check, 'ある処理A' %> <%= check_box_tag :script_b_check %> <%= label_tag :script_b_check, 'ある処理B' %> <%= submit_tag "解析開始" %> <% end %> ``` これで、パラメータとしてURL情報のストリングとチェックボックスの結果が得られます。 後は、コントローラでパラメータを元に、適当に処理してあげれば良いでしょう。 「ある処理」を受け持つ.rbファイルは、libが適当だと思います。 それをControllerで呼び出して処理してあげればOKでしょう。 Railsはwebアプリケーションなので、単体のRubyアプリケーションとはかなり感じが違います。 HTML,CSS,Javascript等の知識も必要とされるので、 本を一冊読むか、チュートリアルを通しでやってみて、癖をつかんでおくのがいいかと思います。 また、初めのうちは、気になっても見た目の部分には手を出さず、 一通り動くようになってから見た目の調整にかかった方が問題が起きにくいかと思います。