2010-12-27 4 views
3

Я новичок в рельсах и стараюсь достичь простой задачи. Я хочу переключить логический атрибут «done» на щелчок изображения. На мой взгляд, моя ссылка выглядит следующим образом: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" %> 

Я добавил маршрут следующим образом:

resources :calendars do 
    get 'toggle_done', :on => :member 
end 

в контроллере, я создал метод:

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 

Когда я щелкните по изображению, ничего не происходит. Я вижу следующую ошибку:

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

Просто FYI, ActiveRecord обеспечивает "тумблер" и «тумблер !» методы, выполняемые точно так же, как и претензии имени по данному атрибуту.

Маршрут ->

resources :calendars do 
    member do 
    put :toggle_done 
    end 
end 

View (убедитесь, что вы используете правильный путь маршрута и правильный HTTP Verb). GET не следует использовать для изменения базы данных в соответствии с архитектурой RESTful.->

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

Controller ->

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

Адитья, черт возьми. Я никогда не знал этого :) спасибо тонну. Опять же просьба поделиться какой-то хорошей книгой или ссылкой на Rails. – Ved

+1

На самом деле в этом случае PUT не следует использовать ни в контексте «архитектуры RESTful». Поскольку GET, PUT и DELETE все требуют indempotence, в том, что вызов действия с параметрами должен возвращать одинаковый результат каждый раз. Поэтому переключатель не будет RESTful, если у вас нет соответствующих PUT и DELETE, или два PUT для каждого состояния (true/false). – saneshark

2

При использовании link_to вы можете указать URL-адрес, передав либо модель с активной записью с соответствующим ресурсом, либо передав правильные аргументы /:action. Теперь вы передаете как аргументы 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/path, поэтому этот маршрут не будет соответствовать/toggle_done. Вот простой маршрут, который будет соответствовать и маршрут/toggle_done к: контроллер =>: календари,: действие =>: toggle_done

match :toggle_done => "calendars#toggle_done" 

Сказав это, я бы предложил идти с RESTful маршрут. Я предполагаю, что у вас есть ресурсы календаря, у которых много фидов_имя, и я предполагаю, что действие toggle_done обновляет сделанное логическое значение на одном из этих фид_итем. Обновление должно отображаться как запрос PUT.

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

Это даст вам маршрут/календари/1/feed_items/2/toggle_done, для переключения между сделано на feed_item 2 в календаре 1.