私はまだRailsのコツをつかんでいます。ここではRails3を使用しており、基本的には、サブスクライブボタンをクリックしたときにAJAX呼び出しをトリガーして、サブスクライブしたトピックのpost_formパーシャルが下に表示されるようにすることです。その後、ボタンはサブスクライブ解除ボタンになり、post_formパーシャルが削除されます。ボタンの切り替えだけでは機能しますが(つまり、直後の2つのスニペットの2行目を削除することで)、*post_form*パーシャルのレンダリングは機能しません。
問題は、次の2つのパーシャルで正しい構文やパラメーターの受け渡しができないように見えることです。トピックオブジェクトが渡されないだけで、サブスクライブまたはサブスクライブ解除ボタンをクリックすると、NilClassエラーに対して無効なmodel_nameが表示されます。ページを手動で更新すると、パーシャルが正しい方法でレンダリングまたは非表示になるため、実際にはAJAXパーツだけが正しく機能していません。
ビュー/サブスクリプション/create.js.erb
$("#subscription_form").html("<%= escape_javascript(render('users/unsubscribe')) %>");
$("#post_form").html("<%= escape_javascript(render('shared/post_form', :topic => @topic)) %>");
ビュー/サブスクリプション/destroy.js.erb
$("#subscription_form").html("<%= escape_javascript(render('users/subscribe')) %>");
$("#post_form").html("<%= escape_javascript(render('shared/post_form', :topic => @topic)) %>");
views / users / _subscription_form.html.erb
<% unless current_user?(@user) %>
<div id="subscription_form">
<% if current_user.subscribed?(@topic) %>
<%= render 'users/unsubscribe', :topic => @topic %>
<% else %>
<%= render 'users/subscribe', :topic => @topic %>
<% end %>
</div>
<% end %>
controllers /subscriptions_controller.rb
class SubscriptionsController < ApplicationController
before_filter :signed_in_user
respond_to :html, :js
def create
@topic = Topic.find(params[:subscription][:topic_id])
current_user.subscribe!(@topic)
respond_with @topic
end
def destroy
@topic = Subscription.find(params[:id]).topic
current_user.unsubscribe!(@topic)
respond_with @topic
end
end
views / shared / _post_form.html.erb
<%= form_for(@post) do |f| %>
<div class="field">
<%= f.hidden_field :topic_id, :value => @topic.id %>
<%= f.text_area :content, placeholder: "Tell us about it ..." %>
</div>
<%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>
それが助けになる場合、関係は次のとおりです。
投稿->belongs_to->トピックとトピック->has_many->投稿