Сбой link_to_unless_current при обработке форм с сообщениями об ошибках в них с маршрутами перезапуска - PullRequest
1 голос
/ 09 июля 2009

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

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

link_to_unless_current "new task", new_task_path

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

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

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

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

  link path = new_task_path

но

  posted path = tasks_path with :method => :post

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 16 июля 2009

Быстрый просмотр источника 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 ИЛИ странице, на которую она была отправлена ​​(например, страница создания

0 голосов
/ 09 июля 2009

Вы можете сделать это с link_to_unless вместо link_to_unless_current:

link_to_unless(controller_name == 'tasks' && 
                 (action_name == 'new' || action_name == 'create'), 
               new_task_path) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...