Rails - Как обновить один атрибут в контроллере - PullRequest
3 голосов
/ 27 декабря 2010

Я новичок в рельсах и пытаюсь выполнить простую задачу.Я хочу переключить логический атрибут «выполнено» при нажатии на изображение.На мой взгляд, моя ссылка выглядит так:

<%= 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 = !@calendar.done
@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"):

Я уверен, что здесь есть что-то очень тривиальное, чего мне не хватает.

Ответы [ 3 ]

8 голосов
/ 27 декабря 2010

Только к вашему сведению, ActiveRecord обеспечивает "переключение" и "переключение!"методы делать в точности так, как утверждает имя для данного атрибута.

Маршрут ->

resources :calendars do
  member do
    put :toggle_done
  end
end

Просмотр (убедитесь, что вы используете правильный маршрут и правильный HTTP-глагол).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 %>

Контроллер ->

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
2 голосов
/ 27 декабря 2010

При использовании link_to вы можете указать URL-адрес, передавая либо модель Active Record со связанным ресурсом, либо передавая обычные :controller / :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 голосов
/ 27 декабря 2010

Несколько быстрых шагов для решения вашей проблемы - переместить: controller и: action из метода link_to в маршрут и исправить ваш маршрут.

Ваш маршрут находится внутри блока для ресурса: календари. Каждый маршрут там будет соответствовать в / calendars / path, поэтому этот маршрут не будет совпадать с / toggle_done. Вот простой маршрут, который будет соответствовать и направить / toggle_done к: controller =>: calendars,: action =>: toggle_done

match :toggle_done => "calendars#toggle_done"

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...