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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

解決済

1回答

2029閲覧

tagged_withで取得したモデルオブジェクトを表示するとTag-itのフォームがレンダリングされなくなる

DaiAoki

総合スコア67

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2017/04/21 14:50

編集2017/04/23 06:16

acts-as-taggable-onのtagged_withメソッドで、特定のタグを含む投稿のみを取り出して、一覧画面に表示した際に、投稿フォームのタグ入力部分がレンダリングされなくなってしまいました。(タグ入力部の生成には、Tag-itを使用)
tagged_withで絞り込みを行わずに表示した場合は、正常にレンダリングされます。
※一覧画面と、投稿フォームは横並びの同一画面となっています。

アプリケーションの作りとしては、
一覧画面の投稿のタグがリンクとなっていて、そこをクリックするとパラメータとしてタグ名をコントローラに渡し、タグ名から投稿を絞りこんで表示するといった作りとなっています。

実ソースを抜粋して下記に記載します。

Ruby

1■static_pages_controller.rb 2def home 3 if logged_in? 4 @bookpost = current_user.bookposts.build 5 @feed_items = params[:selected_tag].present? ? current_user.feed.tagged_with(params[:selected_tag]).paginate(page: params[:page]) 6 : current_user.feed.paginate(page: params[:page]) 7 end 8 end 9 10 11■view(フォーム) 12<%= form_for(@bookpost) do |f| %> 13<label>タグ</label> 14<ul id="ctg-tags"></ul> 15<div class="field"> 16 <%= f.text_area :content %> 17</div> 18<%= f.submit "投稿", class: "btn btn-primary" %> 19<% end %> 20 21 22■view(一覧画面) 23<li id="bookpost-<%= bookpost.id %>"> 24 <span class="user"><%= link_to bookpost.user.name, bookpost.user %></span> 25 <span class="content"><%= bookpost.content %></span> 26 <% bookpost.tag_list.each do |tag| %> 27 <span class="<%= tag %>"> 28 <%= link_to "#{tag}", root_path(selected_tag: tag) %> 29 </span> 30 <% end %> 31</li>

非表示時のHTMLのソースコードと正常に表示される時のソースコードも下記に載せます。

HTML

1■非表示時 2<section class="bookpost_form"> 3 <form class="new_bookpost" id="new_bookpost" action="/bookposts" accept-charset="UTF-8" method="post"> 4 <input name="utf8" type="hidden" value="&#x2713;" /> 5 <input type="hidden" name="authenticity_token" value="AGJ7g9ebvwcB0tw6kzZaSEpR+mrsk6evcvMAS77GKfUgWgVd5UPHzBlCIEh1MikQPNmLABoC5D8/mP8vAUWyuw==" /> 6 <label>タグ</label> 7 <ul id="ctg-tags"></ul> 8 <div class="field"> 9 <textarea name="bookpost[content]" id="bookpost_content"> 10 </textarea> 11 </div> 12 <input type="submit" name="commit" value="ストック" class="btn btn-primary" data-disable-with="ストック" /> 13 </form> 14</section> 15 16 17■正常時 18正常に表示される時は、<ul id="ctg-tags"></ul>の部分が下記に変化します。 19 20<ul id="ctg-tags" class="tagit ui-widget ui-widget-content ui-corner-all"> 21 <li class="tagit-new"> 22 <input type="text" class="ui-widget-content ui-autocomplete-input" autocomplete="off"> 23 </li> 24</ul> 25<input type="hidden" style="display:none;" value="" name="bookpost[tag_list]">

Tag-itがなぜかうまく働かなくなるのが原因っぽいというところまではわかったのですが、
具体的な解決策が思いつかないという状況です。

お詳しい方、どうか力を貸してください。
よろしくお願いします。


【追記】
すみません、表示ロジックを変更したので追記します。
これまでは、前述したように一覧画面と投稿フォームを横並びの同一コントローラ・同一メソッド・同一ビューに記述していましたが、投稿フォームを同一コントローラ内の別のメソッド・別のビューに分離しました。
その結果、画面遷移した直後は変わらずタグフォーム部分が表示されないのですが、リロード(ブラウザを再読み込み)すると表示されるという状態になりました。

下記に変更後のソースコードを記載します。

Ruby

1■static_pages_controller.rb 2def contibute 3 if logged_in? 4 #本当はここで下記のようにform_forに渡す空のモデルオブジェクトを生成したいが、エラーになってしまうため、viewに直接記述して暫定対応。 5 #余裕のある時に見直す 6 #@bookpost = current_user.bookposts.build 7 else 8 redirect_to signup_path 9 end 10 end 11 12 13■view(フォーム) 14<!-- 本当はform_forの引数にはコントローラで用意した@bookpostを渡すべき --> 15<%= form_for(current_user.bookposts.build) do |f| %> 16<label>タグ・カテゴリー</label> 17<ul id="ctg-tags"></ul> 18<div class="field"> 19 <%= f.text_area :content %> 20</div> 21<%= f.submit "投稿", class: "btn btn-green" %> 22<% end %>

【追記2】
Turbolinksが原因でブラウザが更新されず、
$(document).ready()が期待通り動作しないようでした。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決したので、この投稿を見て同じように困っている方のために念のため解決方法を載せます。

原因は、Railsでデフォルト動作する(してしまう)Turbolinksでした。
この機能は一度読み込んだものは読み込まないなどして、速度の向上を計ろうとするものみたいなのですが、
これが災いしてready指定していたJavascriptがページの初回ロード時にしか読み込まれず、結果、レンダリングされない不具合につながりました。

jQuery Turbolinksというgemをインストールすることで解決できるようなのですが、自分はうまくいかなかったため、最終的に下記のようにturbolinksが読み込まれた時にも呼ばれるようにして解決しました。

$(document).on('ready turbolinks:load',function() {.....});

Turbolinksを無効にしてしまうという方法もあるようです。

投稿2017/04/23 07:14

編集2017/04/23 07:15
DaiAoki

総合スコア67

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問