Rails - 如何更新控制器中的单个属性

Ved*_*Ved 3 activerecord ruby-on-rails

我是rails的新手并试图完成一项简单的任务.我想在图像点击时切换布尔属性"完成".在我看来,我的链接看起来像:

<%= link_to image_tag("done.png"),
    feed_item,
    :controller => :calendars, :action=>:toggle_done,:id=> feed_item.id,
    :title => "Mark as done", :remote=> true, :class=>"delete-icon" %>
Run Code Online (Sandbox Code Playgroud)

我添加了一条路线如下:

resources :calendars do
    get 'toggle_done', :on => :member
end
Run Code Online (Sandbox Code Playgroud)

在控制器中,我创建了一个方法:

def toggle_done
    @calendar = Calendar.find(params[:id])
    toggle = !@calendar.done
@calendar.update_attributes(:done => toggle)

respond_to do |format|
  flash[:success] = "Calendar updated"
  format.html { redirect_to root_path }
  format.js
end
Run Code Online (Sandbox Code Playgroud)

当我点击图像时,没有任何反应我看到以下错误:

Started GET "/toggle_done" for 127.0.0.1 at 2010-12-27 13:56:38 +0530
ActionController::RoutingError (No route matches "/toggle_done"):
Run Code Online (Sandbox Code Playgroud)

我相信我在这里缺少一些非常微不足道的东西.

Adi*_*ghi 8

仅供参考,ActiveRecord提供"切换"和"切换!" 完全按照名称在给定属性上声明的方法.

路线 - >

resources :calendars do
  member do
    put :toggle_done
  end
end
Run Code Online (Sandbox Code Playgroud)

查看(确保您使用正确的路径路径和正确的HTTP谓词).根据RESTful架构,不应将GET用于更改数据库. - >

<%= link_to image_tag("done.png"), feed_item, toggle_done_calendars_path(feed_item)
    :title => "Mark as done", :remote=> true, :class=>"delete-icon", :method => :put %>
Run Code Online (Sandbox Code Playgroud)

控制器 - >

def toggle_done
  @calendar = Calendar.find(params[:id])
  @calendar.toggle!(:done)

  respond_to do |format|
    flash[:success] = "Calendar updated"
    format.html { redirect_to root_path }
    format.js
  end
end
Run Code Online (Sandbox Code Playgroud)