Сбой link_to_unless_current при обработке форм с сообщениями об ошибках в них с маршрутами перезапуска

Кто-нибудь знает, как предотвратить сбой механизма link_to_unless_current?

у меня есть навигация по моей странице с

link_to_unless_current "new task", new_task_path

Когда я нажимаю на ссылку, я перехожу к новой форме пути TACS ... И ссылка не создается - & gt; Хорошо. Затем я помещаю неправильные значения в форму и отправляю.

TasksController обрабатывает & quot; создать & quot; действие, проверка для ActiveRecord-модели завершается неудачей из-за неверных данных, и контроллер отображает & quot; новый & quot; действие (и включает в себя сообщения об ошибках для модели).

class TasksController < ApplicationController
    def create
        @task = Task.new(params[:task])

        if @task.save
            flash[:notice] = 'task was successfully created.'
            redirect_to(tasks_url)
          else
            render :action => "new"
        end
    end
end

Но здесь ссылка создается! - & GT; Из-за разницы между URL:

  link path = new_task_path

но

  posted path = tasks_path with :method => :post

Кто-нибудь знает, как правильно решить эту проблему?

Спасибо

Ответы на вопрос(2)

link_to_unless вместоlink_to_unless_current:

link_to_unless(controller_name == 'tasks' && 
                 (action_name == 'new' || action_name == 'create'), 
               new_task_path) 
 BvuRVKyUVlViVIc709 июл. 2009 г., 16:51
Но не существует ли решения, которое работает с именованными маршрутами?
 BvuRVKyUVlViVIc709 июл. 2009 г., 16:50
Лол ... легко легко легко
Решение Вопроса

link_to_unless_current...

... он используетcurrent_path? такой, что вы сможете сделать что-то вроде этого:

В помощнике ...

def current_page_in?(*pages)
  pages.select {|page| current_page?(page)}.compact.any? 
end

... а затем, на ваш взгляд, вы можете просто предоставить массив named_routes или хэшей, как ответ Шэдвелла выше.

<%= link_to_unless(current_page_in?(new_thing_path, things_path), "add a thing") %>

Вы поняли идею ...

ОБНОВЛЕНО

Подумал об этом ... и было бы здорово, если бы вы могли использовать его так, как надеялись, что оригинальный метод сработает. Здесь мы сравниваем предоставленный именованный маршрут (или контроллер + хэш действия) с текущей страницей И ее реферером.

def current_page_or_referrer_in(options)
  url_string = CGI.unescapeHTML(url_for(options))
  request = @controller.request
  # We ignore any extra parameters in the request_uri if the
  # submitted url doesn't have any either.  This lets the function
  # work with things like ?order=asc
  if url_string.index("?")
    request_uri = request.request_uri
    referrer_uri = request.referrer
  else
    request_uri = request.request_uri.split('?').first
    referrer_uri = request.referrer.split('?').first
  end

  #referrer_uri always has full path (protocol, host, port) so we need to be sure to compare apples w apples
  if url_string =~ /^\w+:\/\//
    ["#{request.protocol}#{request.host_with_port}#{request_uri}", referrer_uri].include?(url_string)
  else
    referrer_uri = referrer_uri.gsub(request.protocol, '').gsub(request.host_with_port, '')
    [request_uri, referrer_uri].include?(url_string)
  end
end

Прелесть в том, что теперь вы можете просто сделать это (из вашего примера):

<%= link_to_unless(current_page_or_referrer_in(new_task_path), "Add a task") %>

Затем он будет отображаться, если вы включеныnew_task_path ИЛИ страница, на которую она была отправлена (например, страница создания

 BvuRVKyUVlViVIc729 июл. 2009 г., 13:36
Круто круто круто спасибо
 11 дек. 2009 г., 07:01
Почти как хороший ответ! Но проблема теперь переходит на другую сторону: у меня есть и новая ссылка, и ссылка на список (т.е. индекс), размещенная на левой навигационной панели, и я хочу, чтобы текущее выделение было в действии, в котором я нахожусь. Эта конкретная проблема делает невозможным чтобы найти истинную активную ссылку, она должна быть выделена (т. е. новая), поскольку URL-адрес записи означает, что ссылка на индекс также будет выделена. На самом деле выглядит некрасиво в этой части ....

Ваш ответ на вопрос