3

私はまだ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->投稿

4

1 に答える 1

3

「views/_post_form.html.erb」ファイルで変数「@post」を使用しているようです。

<%= form_for(@post) do |f| %>

アクションのどこにもその変数を設定していないため、null参照エラーが発生します。

次のようなことをする必要があります。

def create
  @post = Post.find(the_post_id)
  @topic = Topic.find(params[:subscription][:topic_id])
  current_user.subscribe!(@topic)
  respond_with @topic
end

また、「トピック」変数をローカルとして渡しますが、インスタンス変数としてアクセスします。_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 %>

私のルビー環境はすぐに利用できないので、これで問題が解決するかどうかは確認できませんが、正しい方向に進むはずだと思います。

于 2012-07-20T19:22:52.460 に答える