在我的任务模型的索引页面上,我想显示一个对应于我的任务数据库表中布尔字段“完成”的每一行的复选框。
目前我的代码进入方法“完成”,但它不包含用户刚刚执行的复选框的值(即,如果他们只是选中了框,则它不会传递给我的“完整”方法)
如何传递用户刚才执行的值 - 选中还是未选中?
/views/tasks/index.html.erb
<% @tasks.each_with_index do |task, i| %>
<tr>
<td><%= check_box_tag 'Complete', task.complete, task.complete, :data => {:remote => true, :url => url_for( :action => 'complete', :id => task.id, :complete => task.complete ), :method => :put}, :class => 'input-large' %></td>
</tr>
<% end %>
/控制器/ tasks_controller#完整
# PUT /complete/1
def complete
@task = Task.find(params[:id])
p "inside complete"
p "complete = #{params[:complete]}"
@task.complete =
if @task.update_attributes(params[:task])
p "inside update"
render :text => "success"
else
p "inside error"
end
end
答案 0 :(得分:5)
rails / jquery-ujs github repo中这个问题的建议对我有用:https://github.com/rails/jquery-ujs/issues/440#issuecomment-197029277
对你而言:
public class User : IdentityUser
{
private ICollection<User> users;
private ICollection<User> followers;
private ICollection<User> followings;
public User()
{
this.Users = new HashSet<User>();
this.Followers = new HashSet<User>();
this.Followings = new HashSet<User>();
}
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<User> Users
{
get { return this.users; }
set { this.users = value; }
}
public virtual ICollection<User> Followers
{
get { return this.followers; }
set { this.followers = value; }
}
public virtual ICollection<User> Followings
{
get { return this.followings; }
set { this.followings = value; }
}
}
答案 1 :(得分:4)
如果您使用的是jQuery,则可以编写单击事件。
$('.input-large').click(function() {
var checked;
if ($(this).is(':checked')) {
checked = true;
} else {
checked = false;
}
$.ajax({
type: "POST",
url: "/tasks/complete",
data: { id: $(this).data('post-id'), checked: checked }
});
});
答案 2 :(得分:4)
从Rails 4开始,你应该能够从原来的答案中抛弃所有的JS。由于jQuery UJS魔术,你问题中的代码应该正常工作。
事实证明,将remote: true
添加到输入会导致jquery-ujs以所有好方式使其成为ajax-y。 Thoughtbot的"A Tour of Rails jQuery UJS"简要介绍了这个(以及其他许多好东西); jQuery UJS wiki中的"Unobtrusive scripting support for jQuery" page也完成了这方面的工作。
答案 3 :(得分:1)
check_box_tag 'complete', task.complete ? 'false' : 'true', task.complete, ...
:url => url_for( :action => 'complete', :id => task.id )
这种方式在你的控制器中你可以获得params [:完成]。 并且您应该实现complete.js.erb以重新呈现复选框,因此下一次单击将发送反向值
或者您可以在点击事件
上实现js$('.input-large').on('click', function() {
$.ajax({
type: "PUT",
url: "/tasks/complete/" + $(this).data('post-id')
data: { complete: $(this).is(':checked') }
});
});
并且不要忘记将data-post-id参数放入复选框