想要在每次触发创建comment_titles的AJAX调用时评估if语句

时间:2011-04-07 03:50:59

标签: javascript jquery ruby-on-rails ruby ruby-on-rails-3

我在视频节目视图中有这个if语句:

<% if @video.user == current_user && current_user != nil && @video.comment_titles.count < 3 %>
    <%= link_to "Add Comment Title", "#", :id => "comment_title_link", :class => "edit" %>
    <%= simple_form_for @video, :remote => true do |f| %>
     <%= f.input :comment_title_names, :label => false, :placeholder => "Add a Comments Title" %>
      <%= f.button :submit, :value => 'Add', :id => 'add_comment_title' %>
      <div class='hint'>Let your listeners know what comments you want by adding a guiding title for them. Pose a question, ask for feedback, or anything else!</div>
    <% end %>
<% elsif @video.comment_titles.count == 3 && @video.user == current_user && current_user != nil  %>
    <p> You have reached your limit of comment titles. You can always add a new one by deleting one of your old ones. </p>
<% end %>

此if语句主要评估@video.comment_titles.count以确定if语句或elsif语句是否为true。我允许用户使用ajax添加comment_titles,因此当@video.comment_titles.count == 3为真时,它将无法正确评估if语句,因为if语句(在我的视频节目视图中)仅在页面重新加载后调用。

我希望每当comment_titles的数量发生变化时动态调用if语句,这相当于每次触发更新comment_titles的AJAX调用时都会说。但是,我宁愿在客户端执行此操作而不是在.js.erb文件中执行此操作。我如何在客户端触发这个?

好的,所以没有人回答,所以我假设我没有提供足够的代码,我不清楚我想要做什么,或者这是不可能的。这是什么?

2 个答案:

答案 0 :(得分:0)

我现在明白你的意思了。您应始终将您的前端与后端同步,因此我建议您在提交评论时执行ajax请求。如果用户可以发表评论,他的请求应返回true或false,如果可以,则发布并重新加载该部分。我不是粉丝或rjs(你似乎正在使用它)所以我不知道语法,但如果它是jquery我可以为你提供更详细的答案。

无论如何,我会用子弹点

来做这件事
  • 用户通过ajax提交表单

    $(“#add_comment_title”)。click(function(){    $就({      类型:'POST',      data:$(“#formwhatever”)。serialize(),      完成:function(html){        $( “#divthatcontainsthatwholeifstatement”)replaceWith(HTML)。      }    })  })

  • 后端检查用户是否已有足够的帖子。如果为false,则返回false给浏览器。如果为true,则添加到db并渲染部分

    在您的控制器中:

    def创建    #pseudo代码因为我也在工作lol    if user.comments.size&lt; 3      #save comment watever    端

    @comments =更新评论

    respond_to do | format |      format.js {render:partial =&gt; “partialthatcontainsthatif”}    端

  • ???
  • PROFIT
无论怎样,这都会“刷新”部分。如果用户已经有超过3条评论,那么它将返回并显示错误检查

答案 1 :(得分:0)

在考虑到您的评论后再次阅读您的问题后,我认为

  • 事件'新评论标题已添加'有一个javascript事件处理程序。
  • 提供的片段驻留在一个容器中,例如<div id="add_comment_title_action">fragment</div>
  • 每次执行事件处理程序时都应刷新片段
  • 您已经看到可以通过$('#add_comment_title_action').load('fragment_url')加载片段,但您只需在客户端中执行此操作

我们假设事件处理程序看起来像

$('#add_comment_title_form').submit(function(e) {
   e.preventDefault();
   $.post( 'url',
          { 'title': 'Lorem ispum dolor sit amet'}
   );
   updateFragment();       
});

然后你可以有一个更新片段的功能

updateFragment() {
  // Let's assume that @video.user == current_user && !current_user.nil?
  if($('.comment_title').size() < 3) {
     // NOP add something here to handle case when a title is deleted
  } else {
     $('#add_comment_title_action').html('<p> You have reached your limit of comment titles. You can always add a new one by deleting one of your old ones. </p>'); 
  }
}

如何更好地制作代码:

  • 应该有一些回调来检查后请求是否成功并相应地进行
  • 您可以通过简单地隐藏和显示取决于状态的选项来处理片段的两种不同状态(如果您可以假设所有用户都启用了javascript和css)
  • 如果您决定用.html(...)替换片段,则片段中元素的事件处理程序应与.live(event, handler)绑定,以便您可以在执行删除后添加新的注释标题

请注意,在客户端完成的每项检查也必须在服务器端完成。

查看完全不同答案的历史:)