Rails form_for: remote => true не вызывает метод js

Существует один пограничный случай, где статичный имеет удивительный эффект (по крайней мере, это было мне). C++ 03 Стандарта указывает в 14.6.4.2/1:

Для вызова функции, который зависит от шаблонного параметра, если имя функции неполный идентификатор , но не шаблонный идентификатор , функции кандидата найдены с помощью обычных правил поиска (3.4.1, 3.4.2) за исключением того, что:

  • Для части поиска с помощью дисквалифицированного поиска имени (3.4.1), только объявления функции с внешней связью от шаблонного контекста определения найдены.
  • Для части поиска с помощью связанных пространств имен (3.4.2), только объявления функции с внешней связью, найденной или в шаблонном контексте определения или в шаблонном контексте инстанцирования, найдены.

...

ниже кода будет звонить foo(void*) а не foo(S const &), как Вы могли бы ожидать.

template <typename T>
int b1 (T const & t)
{
  foo(t);
}

namespace NS
{
  namespace
  {
    struct S
    {
    public:
      operator void * () const;
    };

    void foo (void*);
    static void foo (S const &);   // Not considered 14.6.4.2(b1)
  }

}

void b2()
{
  NS::S s;
  b1 (s);
}

Сам по себе это является, вероятно, не настолько большим соглашение, но оно действительно выделяет это для полностью совместимого компилятора C++ (т.е. один с поддержкой export) static, ключевое слово будет все еще иметь функциональность, которая не доступна никаким другим способом.

// bar.h
export template <typename T>
int b1 (T const & t);

// bar.cc
#include "bar.h"
template <typename T>
int b1 (T const & t)
{
  foo(t);
}

// foo.cc
#include "bar.h"
namespace NS
{
  namespace
  {
    struct S
    {
    };

    void foo (S const & s);  // Will be found by different TU 'bar.cc'
  }
}

void b2()
{
  NS::S s;
  b1 (s);
}

единственный способ гарантировать, что функция в нашем пространстве имен без имени не будет найдена в шаблонах с помощью ADL, состоит в том, чтобы сделать его static.

Обновление для современного C++

С C++ '11, у членов пространства имен без имени есть внутренняя связь неявно (3.5/4):

пространство имен без имени или пространство имен, объявленное прямо или косвенно в пространстве имен без имени, имеют внутреннюю связь.

, Но в то же время 14.6.4.2/1 был обновлен для удаления упоминания о связи (взятый от C++ '14):

Для вызова функции, где постфиксное выражение является зависимым именем, функции кандидата найдены с помощью обычных правил поиска (3.4.1, 3.4.2) за исключением того, что:

  • Для части поиска с помощью дисквалифицированного поиска имени (3.4.1), только объявления функции от шаблонного контекста определения найдены.

  • Для части поиска с помощью связанных пространств имен (3.4.2), только объявления функции, найденные или в шаблонном контексте определения или в шаблонном контексте инстанцирования, найдены.

результат состоит в том, что это конкретное различие между статическими и участниками пространства имен без имени больше не существует.

33
задан nathanvda 31 May 2011 в 10:20
поделиться

1 ответ

Если у Вас есть file_field тогда, он подчиняется как HTML, даже когда remote: true - взял меня долгое время, чтобы разработать это так, я добавляю этот ответ, чтобы, возможно, сэкономить кому-то еще время, есть решение, используйте remotipart драгоценный камень, см. ответ здесь

0
ответ дан 27 November 2019 в 18:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: