Rails check_box_tag如何在ajaxily中检查时传递值

时间:2013-03-29 03:46:21

标签: ruby-on-rails ruby ajax ruby-on-rails-3 ruby-on-rails-3.2

在我的任务模型的索引页面上,我想显示一个对应于我的任务数据库表中布尔字段“完成”的每一行的复选框。

目前我的代码进入方法“完成”,但它不包含用户刚刚执行的复选框的值(即,如果他们只是选中了框,则它不会传递给我的“完整”方法)

如何传递用户刚才执行的值 - 选中还是未选中?

/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

4 个答案:

答案 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参数放入复选框