Вот как заставить ваш плагин делать то, что вы хотите (с помощью javascript, как сказано в учебнике)
Резюме:
Очень сложный, на самом деле не рельс код.Требует знания javascript и использования этих знаний для написания собственной пользовательской формы, а не использования предварительно сгенерированных форм Rails.Это может быть не то, что вы ищете, но похоже, что плагин на самом деле ожидает.Вероятно, сложный для отладки (нужно будет посмотреть исходный код html, какие маршруты попадают в журналы и т. Д.)
Процесс:
Ваш плагин позволяет вам делать что-то вроде:
<%= calendar_date_select_tag "calendar", Date.today,
:embedded => true,
:year_range => 3.years.ago..0.years.ago %>
(в соответствии с учебником, на который вы ссылаетесь).
Это код рельсов.Все, что делает код rails erb, - это быстрый и простой способ создания реального HTML ... Ссылка, например, на
<%= link_to 'Edit', edit_video_path(@video) %>
создает HTML-код, который выглядит следующим образом:
<a href="/videos/1/edit">Edit</a>
Что именно отображает ваш браузер?Пока все хорошо?
Все, что делает rails - это берет ваш файл erb и построчно преобразует его в html, который может отображать веб-страница.Для вас это означает, что к тому моменту, когда ваш плагин действительно запущен (который находится в браузере), кода rails не осталось.Таким образом, вы не можете предоставить любые переменные javascript обратно в ваш код rails, ЕСЛИ вы не передадите его через маршрут.
Как rails обычно обрабатывает формы, делает ли он надлежащие html-теги, а html сам управляет управлениемформа.Даже если вы установите переменные rails в файле .erb, эти переменные на самом деле не помогают данным поступать в ваше приложение rails.Вместо этого, когда вы используете свою форму, вы должны видеть (в своих журналах) что-то вроде:
Started POST "/users/sign_in" for 127.0.0.1 at 2011-02-03 14:22:42 -0500
Processing by Devise::SessionsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"NeqeuxOpBfGVJ0qq5V4emR23vc744KkgJQDFyPluaok=", "user"=>{"email"=>"don@a.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"}
В вашем контроллере (sign_in в приведенном выше случае выглядит так, как будто вы можете создать для себя?), Вы могли быПолучите доступ к этим опубликованным параметрам, сказав params [: user] [: email], или что-то еще, НЕТ, КАК ВЫ СДЕЛАЛИ ИХ.
То есть, да, в вашей форме вы говорите такие вещи, как: название и публикацияdate, но они просто устанавливают параметры, которые вы передаете в rails, а не фактический символ в вашем контроллере rails.С таким же успехом вы можете использовать инструмент командной строки (например, curl) для передачи тех же самых вещей без созданной рельсами веб-страницы.
WHICK, именно так работает решение javascript.
В учебнике говорится, что вы можете делать такие вещи, как:
<%= calendar_date_select_tag "calendar", Date.today,
:embedded => true,
:year_range => 3.years.ago..0.years.ago,
:onchange => "changeLocation(new Date($F(this)))" # <- ADD THIS LINE
%>
, а затем написать функцию javascript (НЕ rails), например:
<script type="text/javascript">
function changeLocation(date) {
year = date.getFullYear();
month = date.getMonth() + 1;
day = date.getDate();
if (month < 10) {
month = "0" + month;
}
if (day < 10) {
day = "0" + day;
}
location.href = 'http://google.com/search?q=' + year + '-' + month + '-' + day;
}
</script>
Вышеприведенный скриптберет любую дату, которую вы выбрали в своем календаре, и отправляет вас на страницу Google с этой датой, как показано в строке:
location.href = 'http://google.com/search?q=' + year + '-' + month + '-' + day;
Это на самом деле очень близко к тому, что мы хотим сделать.Разница в том, что мы хотим, чтобы он устанавливал местоположение для вашего маршрута создания книги, а POST (а не GET, как это делает местоположение) - параметры книги для этого маршрута.Как только мы это сделаем, rails будет обрабатывать его так же, как если бы это была форма, которую он создал сам.
Вы вообще знакомы с спокойными маршрутами?(и что более важно, вы их используете?) location.href (как в примере) выполняет GET, в то время как нам нужно POST, чтобы попасть на маршрут создания с нужной информацией.
Я не слишком знаком с тем, как работает стандартный javascript, но я использую библиотеку "JQuery" для большинства моих POST (которые вы можете включить в начало вашего файла erb, например:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
Jquery позволяет мне изменить код так:
<script type="text/javascript">
function changeLocation(date) {
year = date.getFullYear();
month = date.getMonth() + 1;
day = date.getDate();
if (month < 10) {
month = "0" + month;
}
if (day < 10) {
day = "0" + day;
}
var pdate = year + "/" month + "/" day
$.post("/videos", {publishing_date: pdate}) //this is going to your create route, with the parameters in brackets
}
</script>
Имейте в виду, что это ни в коем случае не единственный способ делать сообщения на JavaScript, это просто как я их делаю.это предполагает, что вы хотите, чтобы ваша дата публикации в формате гг / мм / дд была похожа на туториал (если вы этого не сделаете, создайте pdate по-другому).
Итак, эта последняя должна позволить вам присвоить опцию publishing_date для вашего действия контроллера Railsдля создания книг. Тада! Вы можете получить к нему доступ через params [: publishing_date], если хотите. Если вы хотите, чтобы он выглядел ТОЧНО, как рельсы, вам, вероятно, придется вкладывать в него что-то вроде:
{book: {publishing_date: pdate}}
Так что это похоже на то, что пришло из формы в рельсы.
Если вы хотите получить остальные параметры вашей формы, вам, вероятно, придется не использовать инструменты автоматического создания rails, а вместо этого собрать остальную часть формы с помощью javascript. Есть несколько довольно хороших учебных пособий, но, по сути, когда вы делаете это сообщение, вы хотите изменить его, чтобы получить что-то вроде:
$.post("/videos", {book:{publishing_date: pdate, title: book_name}})
или что-то еще, и пусть имя переменной var book_name задается тем же способом, используя что-то вроде:
var book_name = document.form_name.field_name.value
Где form_name - это имя формы (легко узнать по просмотру источника файла), а field_name - это имя поля (такая же сделка).
Для некоторых моих кодов rails он генерирует что-то похожее на:
<form action="/videos" enctype="multipart/form-data" method="post">
<p>
<label for="video_name">Name</label><br />
<input id="video_name" name="video[name]" size="30" type="text" />
</p>
Который на самом деле не имеет имени для формы (возможно, есть способ установить это с помощью rails), но имя поля будет "video [name]" (не уверен, как javascript будет хотеть скобки ... .но только один способ узнать. Если у javascript есть проблема, вы всегда можете написать форму html вручную и сделать все имена тегов такими, с которыми javascript может иметь дело. Вам не понадобится кнопка отправки, потому что javascript делает отправку для вас.