2014-11-02 123 views
0

我有一个表与项目列表;表中的一列提供了将项目核对为“已完成”的机会。我正在使用f.check_box和f.submit。表单认为它正在保存,但它根本不影响数据库中的项目。窗体来更改一个变量

我的看法代码:

<td><div><%= form_for [t] do |f| %> 
     <%= f.check_box :completed, {}, "true" %> 
     <%= f.submit 'Save' %> 
     <% end %></div></td> 

我的控制器代码是:

def update 
    @todo = Todo.find params[:id] 
    if @todo.save 
     redirect_to :back 
     flash[:notice] = "Success!" 
    else 
     redirect_to :back 
     flash[:notice] = "Please try again." 
    end 
end 

当我点击复选框,然后单击该行的“保存”按钮,我重定向回列表获得“成功!”消息,但数据库中没有任何事情发生。

我唯一能想到的是,当我在列表中查看源代码时,有两种不同的方法被复选框“post”和“patch”调用。我曾在我的routes.rb中创建补丁的路线,因为否则的复选框不会解决所有:

<form accept-charset="UTF-8" action="/todos/53" class="edit_todo" id="edit_todo_53"   method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="_method" type="hidden" value="patch" /><input name="authenticity_token" type="hidden" value="gUQ5ByGVYFncKW+6Rd/hYqiRE+DV5B1IS88EG1hZbBo=" /></div> 

回答

0

对象没有改变的原因是因为根本没有代码来指示对象被改变。

def update 
    @todo = Todo.find params[:id] 
    if @todo.save 

在这里,您获取对象,然后保存它,但不修改它。

您可以更改您的操作以使用update而不是save,并从表单中传递新值。

def update 
    @todo = Todo.find(params[:id]) 
    if @todo.update(params[:todo]) 
    # ... 
    else 
    # ... 
    end 
end 

但是,这将允许用户潜在地更改对象中的任何字段。因此,您只需要过滤允许的字段。

def update 
    @todo = Todo.find(params[:id]) 
    if @todo.update_attribute(todo_params) 
    # ... 
    else 
    # ... 
    end 
end 

def todo_params 
    params.require(:todo).permit(:completed) 
end 

或使用特定的单更新

def update 
    @todo = Todo.find(params[:id]) 
    if @todo.update_attribute(todo_params[:completed]) 
    # ... 
    else 
    # ... 
    end 
end 

def todo_params 
    params.require(:todo) 
end 

最后但并非最不重要的,使用自定义的模型方法将使你的控制器更容易维护和测试。

+0

非常感谢您提供详细,合理的解释! – 2014-11-03 15:40:26

0

在您update动作,你应该有:

def update 
    @todo = Todo.find params[:id] 
    if @todo.update todo_params 
    # ... 
    end 
end 

private 

def todo_params 
    # ... 
end 

save仅持续当前@todo的状态,但它没有改变任何地方。

ps。我假设你至少使用Rails 4.0

+0

谢谢!这工作完美。 – 2014-11-03 15:40:04