在我的视频显示视图中有这个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语句是否为真。我让用户用ajax添加comment_titles,所以到@video.comment_titles.count == 3
为真时,它不会正确地评估if语句,因为if语句,这是在我的视频显示视图中,只在页面重新加载后调用。
我希望if语句在每次comment_titles
的数量变化时都被动态调用,这相当于说每当AJAX调用更新comment_titles被触发时。然而,我宁愿在客户端做这件事,而不是在.js中做这件事。erb文件。我该如何在客户端触发这个呢?
好吧,所以没有人回答,所以我假设要么我没有提供足够的代码,我还没有清楚我在做什么,或者这是不可能的。是哪一个?
考虑到你的评论,我再次阅读了你的问题,我认为
- 有一个javascript事件处理程序'new comment title has been added'。
- 提供的片段驻留在排序容器中,例如
<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>');
}
}
如何改进代码:
- 应该有一些回调来检查post请求是否成功并进行相应的处理
- 你可以通过简单地隐藏和显示根据状态的选项来处理片段的两种不同状态(如果你可以假设所有的用户都启用了javascript和css)
- 如果你决定用
.html(...)
替换片段,那么片段中元素的事件处理程序应该与.live(event, handler)
绑定,这样你就可以在执行删除后添加新的评论标题
请注意,在客户端完成的每个检查也必须在服务器端完成。
看历史得到完全不同的答案:)
我现在有点明白你的意思了。你应该始终同步你的前端与后端,所以我建议你做一个ajax请求,当你提交评论。如果用户可以评论,那么请求应该返回true或false,如果他可以,则发布并重新加载该部分。我不是rjs的粉丝(你似乎正在使用),所以我不知道语法,但如果是jquery,我可以为你提供更详细的答案。
无论如何,我将使用项目符号
-
用户通过ajax提交表单
$ (" # add_comment_title ")。点击(函数(){. ajax({美元类型:"文章",数据:$ (" # formwhatever ") .serialize (),完成:function(html) {$ (" #divthatcontainsthatwholeifstatement ") .replaceWith (html);}})})
-
后端检查用户是否已经有足够的帖子。如果为false,则返回false给浏览器。如果为true,添加到db并呈现部分
:
def创造伪代码,因为我也在工作lol如果user.comments.size <3.#保存评论
结束@comments =更新的评论
respond_to do |format|Format.js {render:partial => " partialthatcontainstheatif "}
结束结束 - ? ? 利润
无论如何都会"刷新"部分。如果用户已经有超过3条评论那么它将返回并显示错误检查