2012-07-20 48 views
3

我仍然得到Rails的支持。在这里,我使用的是Rails 3,目标基本上是当我点击订阅按钮时触发AJAX调用,post_form部分在我刚刚订阅的主题下呈现。该按钮然后变成一个不可置换按钮,并且post_form部分被删除。单独切换按钮可以起作用(即:通过移除紧接的两个片段中的第二行),但* post_form *局部的渲染不会。Rails 3 javascript:如何渲染带参数的部分

问题是我似乎无法得到正确的语法和/或传递参数在以下两个部分。主题对象只是没有通过,当点击订阅或​​取消订阅按钮时,我得到一个无效的model_name NilClass错误。如果我手动刷新页面,部分将以正确的方式呈现或隐藏,所以它只是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)) %>"); 

的意见/用户/ _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 

的意见/共享/ _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 - >帖子

+0

有没有你为什么要做“respond_with @topic”的原因?由于您已经按常规命名了视图,因此您应该能够保留这些视线。 – awbergs 2012-07-20 19:15:33

回答

3

看起来您在“views/_post_form.html.erb”文件中使用变量“@post”。

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

由于您没有在您的操作中的任何位置设置该变量,因此您将收到空引用错误。

你需要做这样的事情:

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 %> 

我没有现成的我的红宝石的环境,所以我无法验证,这将解决你的问题,但我认为它应该让你朝着正确的方向前进。

+0

环境与否,你钉了它。谢谢。 – IanBussieres 2012-07-21 02:05:58