我在视频节目视图中有这个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文件中执行此操作。我如何在客户端触发这个?
好的,所以没有人回答,所以我假设我没有提供足够的代码,我不清楚我想要做什么,或者这是不可能的。这是什么?
答案 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”} 端
端
答案 1 :(得分:0)
在考虑到您的评论后再次阅读您的问题后,我认为
<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>');
}
}
如何更好地制作代码:
.html(...)
替换片段,则片段中元素的事件处理程序应与.live(event, handler)
绑定,以便您可以在执行删除后添加新的注释标题请注意,在客户端完成的每项检查也必须在服务器端完成。
查看完全不同答案的历史:)