show.html.erb
ファイルに2つのタブ/リンクがあるナビゲーションメニューがあります。でUsersController.rb
、ajaxを使用してタブの異なる部分をレンダリングしたいと思います。
私には、コンテンツを表示したい場所show.html.erb
という名前のdivがあります。profile-data
だから私はこのようなことをします:
リンク構造:
<li><%= link_to "College friends", college_friends_path, :remote => true %></li>
<li><%= link_to "Highschool friends", highschool_friends_path, :remote => true %></li>
ルートを定義します。
match "college_friends" => "users#college_friends", :as => "college_friends"
match "highschool_friends" => "users#highschool_friends, :as => "highschool_friends"
そして、UserController.rbで必要なメソッドを定義します。
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
end
def college_friends
respond_to do |format|
format.js
end
end
def highschool_friends
respond_to do |format|
format.js
end
end
end
最後にJSファイルがあります。
* college_friends.js.erb *
$('#profile-data').html("<%= escape_javascript(render(:partial => 'college_friends')) %>");
* highschool_friends.js.erb *
$('#profile-data').html("<%= escape_javascript(render(:partial => 'highschool_friends')) %>");
部分的なコード:_college_friends.html.erb
<% groups = @user.friends.group_by(&:college_name) %>
<% sorted_groups = groups.sort_by{|key, values| values.count}.reverse %>
<% sorted_groups.each do |collegename, friends| %>
<% next if collegename.blank? %>
<div class="contentbox">
<div class="box-header">
<h3><%= collegename %></h3>
<div class="meta-info">
<p><i class="icon-map-marker"></i> Malmö</p>
<p><i class="icon-user"></i><span class="count"> <%= friends.count %></span> vänner</p>
</div>
</div>
<ul class="friends-list">
<% friends.map do |friend| %>
<li><%= image_tag(friend.image) %>
<% end %>
</ul>
</div>
<% end %>
だから私はこの問題を解決しますが、ソースをチェックインおよびチェックアウトします。そして、jsファイルがアプリにロードされていないことに気づきました。
だから私はこれを変更しました:
<%= javascript_include_tag :defaults %>
これに:
<%= javascript_include_tag "application" %>
そして、必要なすべてのjsファイルをロードしました。
しかし、次のエラーが発生します。
ActionView::Template::Error (undefined method `friends' for nil:NilClass):