2010-12-27 7 views
3

저는 레일을 처음 사용하고 간단한 작업을 수행하려고합니다. 이미지 클릭에 부울 속성 "완료"를 토글하고 싶습니다.레일 - 컨트롤러의 단일 속성을 업데이트하는 방법

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

respond_to do |format| 
    flash[:success] = "Calendar updated" 
    format.html { redirect_to root_path } 
    format.js 
end 

I를 :

컨트롤러에서
resources :calendars do 
    get 'toggle_done', :on => :member 
end 

, 내가 방법을 만들었습니다 다음과 같이 내가 경로를 추가

<%= 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" %> 

:처럼 내보기에서 , 내 링크가 보인다 이미지를 클릭해도 아무런 반응이 없습니다. 다음 오류가 표시됩니다.

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

나는 여기에 실종 된 매우 사소한 것이 있음을 확신합니다.

답변

8

그냥 참고로, 액티브은 "전환"과 "전환을 제공 ! " 주어진 속성에 대한 이름 클레임과 정확하게 동일한 메소드.

국도 ->

resources :calendars do 
    member do 
    put :toggle_done 
    end 
end 

보기 (올바른 경로 경로와 올바른 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 %> 

컨트롤러 ->

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 
+1

Aditya, 젠장. 나는 이것을 결코 알지 못했다. :) 덕분에. 다시 좋은 책이나 레일스에 대한 레퍼런스를 공유하라는 요청. – Ved

+1

사실이 경우 PUT은 'RESTful 아키텍처'의 컨텍스트에서 사용되어서는 안됩니다. GET, PUT 및 DELETE는 모두 필요하지 않으므로 매개 변수가있는 작업을 호출 할 때마다 동일한 결과가 반환되어야합니다. 따라서 토글은 해당 PUT 및 DELETE가 없거나 각 상태에 대해 두 개의 PUT (참/거짓)이 없으면 실제로 RESTful이 아닙니다. – saneshark

2

link_to을 사용하는 경우 연결된 리소스가있는 활성 레코드 모델을 전달하거나 일반 :controller/:action 인수를 전달하여 URL을 지정할 수 있습니다. 이제 Active Record 모델 (feed_item)과 :controller/:action 인수를 모두 전달하지만이 경우에는 :controller/:action 인수 만 전달해야합니다.

또한 URL 해시와 추가 HTML 인수를 모두 전달할 때 두 해시를 구분하기 위해 대괄호를 포함해야합니다.

따라서, 다음을 시도해보십시오 : 컨트롤러 :

<%= link_to image_tag("done.png"), 
    { :controller => :calendars, :action =>:toggle_done, :id => feed_item.id }, 
    { :title => "Mark as done", :remote => true, :class =>"delete-icon" } %> 
+0

이 작업에 대한 경로를 생성하는 경로 도우미를 사용하십시오. –

+0

이 솔루션은 효과가있었습니다. 레일스에 대한 포괄적 인 책/자료를 가르쳐 주시면 정말 감사하겠습니다. 장바구니를 만드는 책의 대부분은 실제로 그다지 중요하지 않습니다. – Ved

0

빠른 단계는 문제가 이동하는 것입니다 해결하기 위해 LINK_TO 방법에서 그리고 경로로 작업을하고, 경로를 수정.

귀하의 경로는 자원 : 캘린더 블록 안에 있습니다. 거기에있는 모든 경로는/calendars/경로에서 일치하므로이 경로는/toggle_done과 일치하지 않습니다. 달력 : =>를 컨트롤러 : 여기에 일치 노선/toggle_done하는 간단한 경로의 액션 => : toggle_done

match :toggle_done => "calendars#toggle_done" 

내가 편안 경로로가는 것이 좋습니다 것이라고 말했다 가졌어요. 많은 feed_item이있는 캘린더 리소스가있는 것 같습니다. toggle_done 액션이 feed_item 중 하나에서 done 부울을 업데이트한다고 생각합니다. 업데이트는 PUT 요청으로 매핑되어야합니다.

resources :calendars do 
    resources :feed_items do 
    put :toggle_done, :on => member 
    end 
end 

이 당신에게/달력/1/feed_items/2/toggle_done에 대한 경로를 제공합니다 일정에 feed_item이 이루어 전환하려면 1.

관련 문제