2014-11-02 32 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

相關問題