Направляющие STI использование ОДНОЙ формы

У меня есть форма, которая позволяет мне добавлять файлы различных форматов к потоку. Так, поток составлен из многих файлов, эти файлы являются XML-файлами, но в основном имеют различные схемы. У меня есть одна форма, которая позволяет пользователю добавлять безотносительно файла, который они хотят, я использую STI (который работает отлично, когда данные уже находятся в таблице), моя проблема добавляет данные к таблице.

Форма имеет 1 поле ввода, просто file_field, который позволяет пользователю выбирать файл, который они хотят загрузить. Так как у меня только есть одна форма, я не могу инстанцировать правильного объекта, я должен сделать это программно.. и я не уверен, как сделать это.

Я просто (или может I) добавлять выпадающее с возможными типами, и вызов, что поле 'тип' так, чтобы то, когда форма является отправленными направляющими, инстанцировало типа записи объекта, потому что атрибут типа обеспечивается?

Какова лучшая практика для этого.. Я выполняю направляющие 2.3.4.

6
задан Rabbott 1 February 2010 в 06:19
поделиться

2 ответа

Я бы использовал вариант - только для std:: vector - довольно ясно, что имеется в виду, и простота операции (которая не больше, чем вычитание указателя) выражается синтаксисом ( расстояние , с другой стороны, звучит как пифагор при первом чтении, не так ли?). Как указывает Бэн, - также действует как статическое утверждение в случае, если вектор случайно изменяется на список .

Кроме того, я думаю, что это гораздо чаще - нет цифр, чтобы доказать это. Главный аргумент: it - vec.begin () короче в исходном коде - меньше типизации, меньше места. Поскольку ясно, что правильный ответ на ваш вопрос сводится к вопросу вкуса, это может также быть действительным аргументом.

-121--1811013-

Чтобы ответить на ваш первый вопрос, вы можете использовать любую библиотеку Java OAuth на Android, вот ссылка на учебное пособие, в котором используется библиотека Java OAuth project для разработки потребительского приложения на Android:

Обратите особое внимание на регистрацию Вы будете использовать эту схему URI при отправке параметра oauth_callback, который позволит вашим пользователям легко проходить через трехногий рабочий процесс (в основном вы получите маркер запроса от процессора СХД, направите пользователя на процессор СХД через браузер для авторизации маркера, затем процессор СХД перенаправит пользователя обратно в ваше приложение с помощью пользовательской схемы URI).

Теперь для вашего второго вопроса: Когда кто-то говорит, что сайт или услуга поддерживает OAuth, это обычно означает, что они внедрили OAuth в качестве поставщика услуг. Это означает, что вы можете разработать потребительское приложение, которое использует OAuth для выполнения делегированной авторизации на защищенные ресурсы, размещенные службой. Обратите внимание, какую версию спецификации OAuth поддерживает служба/сайт. Большинство должно быть на 1.0a, но некоторые все еще могут быть на 1.0, который имеет несколько другой рабочий процесс. Вы можете спокойно игнорировать различия и просто прочитать 1.0a спецификации, если это то, что они поддерживают, в противном случае вы хотите, чтобы откопать 1.0 спецификации (ссылки приведены ниже).

Дайте мне знать, если это поможет, или если есть что-то конкретное, о чем вы хотели бы, чтобы я подробнее! Удачи с вашим приложением!

Обратите внимание, что 1.0 имеет некоторые проблемы безопасности, которые были решены в 1.0a. Также обратите внимание, что 1.0a была переписана как черновик IETF. Используемая терминология несколько отличается в проекте IETF, и некоторые требования были отклонены при использовании защищенного транспортного уровня (т.е. SSL) и метода подписи открытого текста. Большинство SP по-прежнему будут придерживаться 1.0a. В противном случае черновик IETF гораздо более хорошо написан и заслуживает прочтения, если не забывать о терминологических различиях:

-121--2603865-

Я нашел решение по адресу http ://coderrr.wordpress.com/2008/04/22/building-the-right-class-with-sti-in-rails/# comment-1826

class GenericClass < ActiveRecord::Base
  class << self
    def new_with_cast(*a, &b)
      if (h = a.first).is_a? Hash and (type = h[:type] || h['type']) and (klass = type.constantize) != self
        raise "wtF hax!!"  unless klass < self  # klass should be a descendant of us
        return klass.new(*a, &b)
      end

      new_without_cast(*a, &b)
    end
    alias_method_chain :new, :cast
  end
end

Что отлично сработало для меня с минимальным кодом - не знаю, работает ли его халтура или нет, но он довольно чистый. Мне понравилось то, что его единственные 10ish строки кода.

3
ответ дан 17 December 2019 в 18:16
поделиться

Я не знаю, сколько у вас типов, но в прошлом я просто использовал отдельные контроллеры и представления для разных типов. Таким образом, вы не создаете новый объект базового класса и не пытаетесь установить тип, вы просто используете модель, наследуемую от базового класса. Каждая новая страница / страница редактирования для ваших ресурсов может отображать разделяемый партиал в блоке form_for. Партиал будет содержать ваше поле_файла.

Таким образом, когда форма будет отправлена, она перейдет к правильному контроллеру, вызовет правильный resource.new, и все будет в порядке.

Недостатком, конечно же, является большее количество файлов, и на какую бы страницу вы ни ссылались, чтобы «добавить новый файл», вам необходимо добавить несколько ссылок, таких как «добавить новый файл этого типа», «добавить новый файл этого типа» и т. Д.

Что касается установки типа в форме, я не уверен, работает ли это, я сомневаюсь, но просто попробуйте (дайте нам знать). Вы можете сделать этот тип выпадающим с помощью select_tag и при изменении использовать Javascript для изменения местоположения действия в форме.

Отредактировано и добавлено базовое решение

Не то чтобы мне это решение нравилось, и я сомневаюсь, что оно ни в коем случае не лучшее, но если вам действительно не нужны отдельные контроллеры и вам нужно заставить его работать, вы можете сделать что-то вроде это:

class XmlFile < ActiveRecord::Base
end

class XmlFileTypeA < XmlFile 
end

class XmlFileTypeB < XmlFile 
end

def create
    # Leaving this case statement in the controller for simplicity but you probably want to move this to the model
    case params[:chosen_xml_type]
      when "file_type_a"
        @item = XmlFileTypeA.new(params)
      when "file_type_b"
        @item = XmlFileTypeB.new(params)
      else
        raise "Unknown file type!"
      etc
    end
end
0
ответ дан 17 December 2019 в 18:16
поделиться
Другие вопросы по тегам:

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