Добавьте простую ссылку для установки логического поля в Rails - кажется, ничего не происходит - PullRequest
4 голосов
/ 30 января 2011

Я пытаюсь добавить ссылку в представление Rails, чтобы установить для логического поля значение true при его нажатии.В контроллере (present_controller.rb) у меня есть следующий код:

def taken_toggle
  @matching = Present.find(params[:id])
  @matching.taken = true
  @matching.save
end

и в связанном представлении у меня есть следующий код:

<%= link_to "I want to buy this present", :url => {:action => "taken_toggle", :id => @present.id} %>

Однако, когда я нажимаю кнопкуНичего не произошло.Если я вернусь к основному списку, логическое поле не было обновлено.В журнале я получаю следующее:

Started GET "/presents/2/edit?url[action]=taken_toggle&url[id]=2" for 152.78.101.154 at Sun Jan 30 04:56:34 -0800 2011
  Processing by PresentsController#edit as HTML
  Parameters: {"url"=>{"action"=>"taken_toggle", "id"=>"2"}, "id"=>"2"}
Rendered presents/_form.html.erb (6.0ms)
Rendered presents/edit.html.erb within layouts/application (10.0ms)
Completed 200 OK in 13ms (Views: 10.7ms | ActiveRecord: 0.9ms)

Я уверен, что упускаю что-то действительно простое - кто-нибудь знает, что это такое?

Обновление: Я добавил маршрут, и rake routes теперь дает следующую строку (среди всех обычных маршрутов):

taken_toggle_present PUT    /presents/:id/taken_toggle(.:format) {:controller=>"presents", :action=>"taken_toggle"}

На что я должен изменить ссылку, чтобы она работала?На данный момент ссылка по-прежнему:

<%= link_to "I want to buy this present", :url => {:action => "taken_toggle", :id => @present.id} %>

Но мне это кажется правильным, так как он идет к правильному действию и передает идентификационный номер.Любые идеи?

Обновление: Я попробовал последние ответы, но оба они приводят к следующей ошибке журнала:

Started GET "/presents/2/taken_toggle" for 86.150.141.2 at Fri Feb 04 01:37:23 -0800 2011

ActionController::RoutingError (No route matches "/presents/2/taken_toggle"):

Это кажется немного странным, учитываявыход rake routes выше.Есть идеи?

Ответы [ 5 ]

4 голосов
/ 10 февраля 2011

Похоже, вы работаете с приложением rails 3.Получение правильных методов (GET, PUT) и маршрутов должно работать.

Часть маршрутов, либо определите take_toggle в ресурсе present, например:

resources :presents do
  member do
    put :taken_toggle
  end
end

, либо просто используйте match, как у НикитыПредложено:

match 'presents/:id/taken_toggle', :as => "taken_toggle_present",
  :to => "presents#taken_toggle"

Теперь часть ссылки:

<%= link_to "I want to buy this present", taken_toggle_present_path(@present), <strong>:method => :put</strong> %>

3 голосов
/ 04 февраля 2011

Ваш маршрут ожидает запрос PUT. Попробуйте это:

<%= link_to "I want to buy this present", taken_toggle_present_path(@present), :method => :put %>
1 голос
/ 04 февраля 2011

link_to не принимает параметр :url, поэтому он переводит все в вашем хэше :url в параметры GET: вы можете увидеть их в пути запроса в ваших журналах:

GET "/presents/2/edit?url[action]=taken_toggle&url[id]=2"

Вы можете просто извлечь часть :url => { }, чтобы ссылка работала:

link_to "I want to buy this present", :action => "taken_toggle", :id => @present.id

Однако в общем случае предпочтительным способом указания ссылки на действие покоя является использование path helper :

link_to "I want to buy this present", taken_toggle_present_path(@present)
1 голос
/ 30 января 2011

Откройте вашу оболочку и запустите rake routes; Вы должны увидеть маршрут отдыха для действия taken_toggle.

Если вы не можете его найти, вам нужно добавить новое действие . Запустите rake routes снова.

Используйте этот маршрут в своей ссылке.


Рассмотрите возможность переключения с GET на POST, поскольку это действие изменяет состояние ваших данных.

0 голосов
/ 04 февраля 2011

Учитывая, что вы используете маршрут PUT, вы должны создать форму с PUT в качестве метода для выполнения этого действия.

Хотя это может противоречить парадигме REST, я бы порекомендовал создать маршрут GET, если вы хотите выполнить это действие с помощью простой ссылки. Не делайте так, чтобы любой удар по этой ссылке изменил состояние объектов.

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