cle*_*lem 19 ajax checkbox ruby-on-rails prototypejs
我有一个小小的演示设置,其中单击一个复选框通过AJAX切换属性.它工作正常,但Rails真的想渲染一些东西,所以我基本上是在我的视图中创建一个空白的toggle.js.erb文件.
有问题的控制器行为:
def toggle
@task = Task.find(params[:id])
respond_to do |format|
format.js do
if (@task.status != true)
@task.status = true
else
@task.status = false
end
@task.save
render :layout => false
end
end
end
Run Code Online (Sandbox Code Playgroud)
查看问题:
<h1>Tasks</h1>
<ul style="list-style-type: none;">
<% @tasks.each do |task| %>
<li id="<%= dom_id(task) %>">
<%= check_box_tag(dom_id(task), value = nil, checked = task.status) %>
<%= task.action %> <%= link_to 'Edit', edit_task_path(task) %>
<%= link_to 'Delete', task, :confirm => 'Are you sure?', :method => :delete, :remote => true %>
</li>
<% end %>
</ul>
<%= link_to 'New Task', new_task_path %>
<script>
$$('input').each(function(el) {
el.observe('click', function(event) {
// Get the task ID
var elId = el.id.split("_")[1];
// Build the toggle action path
var togglePath = '/tasks/' + elId + '/toggle/';
// Create request, disable checkbox, send request,
// enable checkbox on completion
new Ajax.Request(togglePath, {
onCreate: function() {
el.disable();
},
onSuccess: function(response) {
},
onComplete: function() {
el.enable();
}
});
});
});
</script>
Run Code Online (Sandbox Code Playgroud)
如果没有我在视图中的空白toggle.js.erb文件,Rails仍然会给我一个错误,说它正在尝试渲染一些东西.
最后,我希望两者都不必有一个空白的toggle.js.erb文件,而且我希望将Prototype的东西放到我的静态JavaScript中,然后放在视图之外.
我对Rails很陌生,所以可能有一种更简单的方法可以做到这一点,但我有点被困在这里.
Bit*_*rse 42
render :layout => false 表示您想要在没有布局的情况下渲染"切换"视图.
如果你不想渲染任何东西,你应该使用:nothing => true选项
def toggle
@task = Task.find(params[:id])
@task.toggle! :status
# if it used only by AJAX call, you don't rly need for 'respond_to'
render :nothing => true
end
Run Code Online (Sandbox Code Playgroud)
编辑:在Rails4/5中你可以使用head :ok而不是render nothing: true,这是更好的方法来做到这一点,但结果是相同的.
| 归档时间: |
|
| 查看次数: |
10375 次 |
| 最近记录: |