2012-11-07 88 views
1

我正在打印用戶聯繫人列表,並希望讓用戶能夠將每個聯繫人標記爲「已完成」。 (基本上將它們標記爲待辦事項列表)。在has_many關係上更新屬性

如何更新特定聯繫人的done屬性?

這是形式的隱藏字段不工作:

<% if current_user.contacts.any? %> 
<% current_user.contacts.each do |c| %> 
    <li id="<%= c.id %>"> 
     <%= c.name %><br/> 

     <%= form_for(@contact) do |f| %> 
      <%= f.hidden_field :done, :value=>true %> 
      <%= f.submit "Mark as done", class: "btn btn-small btn-link"%> 
     <% end %> 

    </li> 
<% end %> 

我得到這個錯誤:

Template is missing Missing template contacts/create, application/create with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}. Searched in: * "C:/Sites/rails_projects/sample_app/app/views" 

這是我接觸控制:

def create 
    @contact = current_user.contacts.build(params[:contact]) 
    if @contact.save 
    flash[:success] = "Contact saved!" 
    redirect_to root_url 
    else 
    flash[:error] = "Something is wrong" 
    end 
end 

回答

1

對於某些原因,可能是由於驗證規則,@contact對象不能保存。 在這種情況下,創建操作中的else分支未指定要呈現的內容,因此它正在查找create模板。假設您的新操作不需要預加載其他數據,您可以簡單地將一行添加到render :action => :newredirect_to :action => :new

else 
    flash[:error] = "Something is wrong" 
    redirect_to :action => :new 
end 

您還可以使用respond_with,而不是明確重定向,這將使得new行動,如果發現錯誤:

def create 
    @contact = current_user.contacts.build(params[:contact]) 
    if @contact.save 
    flash[:success] = "Contact saved!" 
    else 
    flash[:error] = "Something is wrong" 
    end 
    respond_with @contact, :location => root_url 
end 
+0

是@contact = current_user.contacts.build(PARAMS [:聯繫人])如果我只想更新':done',而不是創建新的聯繫人,請在這裏調用正確的方法? – kwh941

+0

您可以使用它來'建立'一個新的聯繫人,但不會更新數據庫中的任何內容。你只是在內存中有一個未被執行的聯繫人。 – PinnyM

+0

那麼我應該怎麼把form_for(____)呢?那該怎麼辦? – kwh941

相關問題