質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

1回答

1875閲覧

フラグの「一括」更新

innjera

総合スコア132

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2017/02/07 06:38

###実現したいこと
以下画面の承諾、拒否のフラグをクリックで選択し、『申し込みのフラグを更新する』を押すと、フラグが一括更新される機能を実装したのですが、『申し込みのフラグを更新する』をクリックしても、controller記載のflash.notice = 'レッスン申込者のフラグを更新しました。'は表示されるのですが、フラグは更新されません。

実装にあたりRails : フォームオブジェクトJavaScriptを利用しています。

誤りをご指摘頂きたく宜しくお願い致します。

イメージ説明

申し込みのためのフォームオブジェクト

ruby

1class User::EntriesForm 2 include ActiveModel::Model 3 4 attr_accessor :product, :approved, :not_approved, :canceled, :not_canceled 5 6 def initialize(product) 7 @product = product 8 end 9 10 def assign_attributes(params) 11 @approved = params[:approved] 12 @not_approved = params[:not_approved] 13 @canceled = params[:canceled] 14 @not_canceled = params[:not_canceled] 15 end 16 17 def save 18 approved_entry_ids = @approved.split(':').map(&:to_i) 19 not_approved_entry_ids = @not_approved.split(':').map(&:to_i) 20 canceled_entry_ids = @canceled.split(':').map(&:to_i) 21 not_canceled_entry_ids = @not_canceled.split(':').map(&:to_i) 22 23 ActiveRecord::Base.transaction do 24 @product.entries.where(id: approved_entry_ids). 25 update_all(approved: true) 26 @product.entries.where(id: not_approved_entry_ids). 27 update_all(approved: false) 28 @product.entries.where(id: canceled_entry_ids). 29 update_all(canceled: true) 30 @product.entries.where(id: not_canceled_entry_ids). 31 update_all(canceled: false) 32 end 33 end 34end

テンプレート

html

1<table class="table"> 2 <thead> 3 <tr> 4 <th>#</th> 5 <th>ユーザーネーム</th> 6 <th>承諾</th> 7 <th>拒否</th> 8 </tr> 9 </thead> 10 <tbody> 11 <tr> 12 <th scope="row">1</th> 13 <td>erika</td> 14 <td> 15 <input type='checkbox', class='approved', data-entry-id='1'> 16 </td> 17 <td> 18 <input type='checkbox', class='canceled', data-entry-id='1'> 19 </td> 20 </tr> 21 </tbody> 22 <tbody> 23 <tr> 24 <th scope="row">2</th> 25 <td>chimaki</td> 26 <td> 27 <input type='checkbox', class='approved', data-entry-id='2'> 28 </td> 29 <td> 30 <input type='checkbox', class='canceled', data-entry-id='2'> 31 </td> 32 </tr> 33 </tbody> 34 <tbody> 35 <tr> 36 <th scope="row">3</th> 37 <td>sotako</td> 38 <td> 39 <input type='checkbox', class='approved', data-entry-id='3'> 40 </td> 41 <td> 42 <input type='checkbox', class='canceled', data-entry-id='3'> 43 </td> 44 </tr> 45 </tbody> 46 <tbody> 47 <tr> 48 <th scope="row">4</th> 49 <td>ruffy</td> 50 <td> 51 <input type='checkbox', class='approved', data-entry-id='4'> 52 </td> 53 <td> 54 <input type='checkbox', class='canceled', data-entry-id='4'> 55 </td> 56 </tr> 57 </tbody> 58</table> 59<div class = 'button-wrapper'> 60 <form class="new_form" id="new_form" action="/user/products/1/entries" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="_method" value="patch" /><input type="hidden" name="authenticity_token" value="se6s0O8G5KRrknZrFG79P8IIkOH7BrU79SYHeLSkcvh2VGyiLCpMNuzDl8GfBTLi6RR+egO/yWfElgG15xU37A==" /> 61 <input type="hidden" name="form[approved]" id="form_approved" /> 62 <input type="hidden" name="form[not_approved]" id="form_not_approved" /> 63 <input type="hidden" name="form[canceled]" id="form_canceled" /> 64 <input type="hidden" name="form[not_canceled]" id="form_not_canceled" /> 65 <button name="button" type="button" id="update-entries-button" class="btn btn-outline-primary">申し込みのフラグを更新する</button> 66</form></div> 67 68#上記部分のruby記述 69<div class = 'button-wrapper'> 70 <%= form_for User::EntriesForm.new(product: @product), as: 'form', url: [:entries, :user, @product], html: { method: :patch} do |f| %> 71 <%= f.hidden_field :approved %> 72 <%= f.hidden_field :not_approved %> 73 <%= f.hidden_field :canceled %> 74 <%= f.hidden_field :not_canceled %> 75 <%= button_tag '申し込みのフラグを更新する', type:'button', id:'update-entries-button', class: "btn btn-outline-primary"%> 76 <% end %> 77</div>

ルーティング

ruby

1resources :products do 2 patch :entries, on: :member 3end

申し込みのフラグを更新するボタンを押された時の処理を記述したJavaScript

JavaScript

1$(function() { 2 return $('div.button-wrapper').on('click', 'button#update-entries-button', function() { 3 var approved, canceled, not_approved, not_canceled; 4 approved = []; 5 not_approved = []; 6 canceled = []; 7 not_canceled = []; 8 $('table.entries input.approved').each(function() { 9 if ($(this).prop('checked')) { 10 return approved.push($(this).data('entry-id')); 11 } else { 12 return not_approved.push($(this).data('entry-id')); 13 } 14 }); 15 $('#form_approved').val(approved.join(':')); 16 $('#form_not_approved').val(not_approved.join(':')); 17 $('table.entries input.canceled').each(function() { 18 if ($(this).prop('checked')) { 19 return canceled.push($(this).data('entry-id')); 20 } else { 21 return not_canceled.push($(this).data('entry-id')); 22 } 23 }); 24 $('#form_canceled').val(canceled.join(':')); 25 $('#form_not_canceled').val(not_canceled.join(':')); 26 return $('div.button-wrapper form').submit(); 27 }); 28});

コントローラー

ruby

1def entries 2 entries_form = User::EntriesForm.new(Product.find(params[:id])) 3 entries_form.assign_attributes(params[:form]) 4 entries_form.save 5 flash.notice = 'レッスン申込者のフラグを更新しました。' 6 redirect_to [current_user, :user_product] 7 end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moke

2017/02/07 07:14

大変申し訳ないですが、railsから脱線しているようです。これを動くようにもできますが、railsに従って書き直す方が早いような気がします。
guest

回答1

0

回答になっていなくてすみません
このまま修正するかrailsに沿って作り直すか
決めていただきたいと思います

今更ですが一括更新はcocoonやnested_form
を使うと楽ですよー。(本当はactivemodelを使うのがベストですが)
コード記述が三分の一になりますし
セキュリティも高められます。
jsも最小限の記述になります。

レール(rails)に乗った人生なんてくそっくらえと言うならこの脱線したコードを
脱線したまま動くようお手伝いしますが。
railsの恩恵をほとんど受けれないと思います。

投稿2017/02/07 07:30

編集2017/02/07 08:18
moke

総合スコア2241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

innjera

2017/02/07 08:00

コメント有難うございます。 Railsからはみ出したいタイプですので、このまま修正したいと考えております。 というのも、若干イレギュラーなこのやり方で動かせると、何かと応用効くかな、と考えております もし、お気付きのミスあればご指摘頂けますと大変有難いです。 cocoon、nested_formアドバイス有難うございます。これらは別途勉強してみます!
moke

2017/02/07 08:14

えーっと、はみ出しと脱線は違いますよ。 はみ出しは修正してレールに戻せますし知識があればかえって良くなることもありますが 脱線は破綻しています。レールのない荒野を走っているようなものです。 じゃあなぜrailsを使うんだろうと言う話になるレベルなんですが それでもいいならこのまま回答を考えます。
innjera

2017/02/07 14:15

有難うございます、ご指摘の通りにRailsのセオリー通りに行うことが望ましいと思います。 一方で、コードや実現したい子を見直して考えてもみたのですが、本件、そこまで脱線している様にも思えず、もう少しこの仕様でできないか、あがいてみることにします!!
moke

2017/02/08 16:00

一応コードは全部追わせていただきましたが、私が未熟なため問題が見つけられませんでした。 これ以上となるとやはり環境を再現して、post時のparamやjavascriptの内容をdebugしないとわかりません、ちょっとそこまで時間が割けないので、innjeraさん自身でdebugをしてみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問