Как передать значение JavaScript в символ, используемый в Ruby on Rails - PullRequest
1 голос
/ 03 февраля 2011

В настоящее время я использую Rails 2.0.2 с Ruby 1.8.7.Моя версия Prototoype.js - 1.7 (если требуется).Я в основном пытаюсь интегрировать плагин calendar_date_select в свое приложение.

Ссылка / учебник, на который я ссылаюсь: http://ianli.com/site/HowTo/UseCalendarDateSelectRailsPlugin

Я пытаюсь сохранить полученную дату через выбранную датуПлагин и хранить в рельсах символ: публикации_даты.

Я выбираю дату с помощью плагина calendar_date_select.Выбранная дата загружается в текстовое поле, но я не уверен, как передать это возвращенное значение в мой атрибут publishing_date (: символ публикации_даты) моей таблицы книг.

При вводе даты вручную, я могуувидеть это отражено в БД.Я застреваю, когда пытаюсь сохранить его через плагин.

   <%= f.text_field :publishing_date %>

При нажатии на кнопку создания я получаю нулевое значение для даты, выбранной с помощью плагина calendar_date_select.Я могу правильно вставить значения для названия книги и автора.

Мой код для новой книги выглядит следующим образом:

<%= javascript_include_tag :defaults %>


<script src='/javascripts/calendar_date_select/calendar_date_select.js' type='text/javascript'></script> 


<h1>New book</h1>

<%= error_messages_for :book %>

<% form_for(@book) do |f| %>
  <p>
    <b>Title</b><br />
    <%= f.text_field :title %>
  </p>

  <p>
    <b>Author</b><br />
    <%= f.text_field :author %>
  </p>


<p>
    <b>Publishing Date</b><br />


 <%=calendar_date_select_tag f.text_field :publishing_date %> <!--This way of save/assigning doesn't work -->

</p>

   <br />
   <br />
   <br />
   <br />

   <p>
    <%= f.submit "Create" %>
  </p>
<% end %>

<%= link_to 'Back', books_path %>

Также, как только я сохраню это идеально, не могли бы вы такжескажите, как я смогу отобразить эту дату в моем index.html.erb

Мой текущий index.html.erb выглядит так:

<h1>Listing books</h1>

<table>
  <tr>
    <th>Title</th>
    <th>Author</th>
    <th>Publishing Date</th>
  </tr>

<% for book in @books %>
  <tr>
    <td><%=h book.title %></td>
    <td><%=h book.author %></td>
    <td><%= book.publishing_date %></td> <!-- Will this work? -->
    <td><%= link_to 'Show', book %></td>
    <td><%= link_to 'Edit', edit_book_path(book) %></td>
    <td><%= link_to 'Destroy', book, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
</table>
<%= will_paginate @books %>

<br />

<%= link_to 'New book', new_book_path %>

Интересный отрывок извышеупомянутая ссылка на учебник приведена ниже:

The value of the selected date can be accessed by getting the value of the text field named calendar.

Using the Prototype Javascript Library, you can do the following to get the value.

$F('calendar')

На пути, с которым я сталкиваюсь, заключается в том, как вызвать $F('publishing_date') в моем файле new.html.erb с помощью тега rails <%=>, а затем назначить его моему: символ publishing_date, который в конечном итоге будет использоваться для обновления атрибута publishing_date в таблице моих книг.

Спасибо за вашу поддержку.

Ответы [ 2 ]

3 голосов
/ 04 февраля 2011

Вот как заставить ваш плагин делать то, что вы хотите (с помощью 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 делает отправку для вас.

2 голосов
/ 03 февраля 2011

Что касается «Как отобразить», вы правы, что

book.publishing_date

будет работать просто отлично, ЕСЛИ это будет установлено. Вы говорите, что можете просто установить его с текстовым полем, верно (т.е. ваши миграции правильны)? Сделав это, вы должны подтвердить это на странице вашего индекса.

Кроме того, по моему опыту, переменные javascript нельзя передавать на rails (хотя переменные rails можно передавать в javascript). Таким образом, вы никогда не сможете получить $ F ('publishing_date') в свой файл erb. К тому времени, когда устанавливаются любые javascript-переменные, это уже не программа Ruby, это просто веб-страница ... НЕОБХОДИМО, чтобы ваш плагин по умолчанию обрабатывал вещи, и я немного удивлен, что это не работает коробка ... Хм ... подожди ...

Я просто просмотрел учебник, на который вы ссылались, и я думаю, что вижу вашу проблему:

Ваш плагин на самом деле не является помощником по формам (работает с "form_for).

Если это БЫЛ помощник по форме (и установит переменную формы так, как вы хотите), вы бы вызвали его с помощью:

<% f.calendar_select_tag%>

Что сделало бы это параметром, передаваемым в вашу форму. В этом случае кажется, что это просто создание календаря для вас, который вы затем можете запрограммировать для обработки своего собственного javascript (например, «функция changeLocation (date)» в руководстве). Он не имеет ничего общего с формами.

Если вы хотите, чтобы этот интерфейс действительно работал с формой, вам нужно создать форму в формате html / javascript, а НЕ с помощью вспомогательных тегов ruby. (что сложнее).

Вам понадобится пост, который содержит «$ F ('publishing_date')» в параметрах, а также любые другие переменные javascript, которые вы хотите установить, и нажмите ваш маршрут создания вручную через javascript. , с этими переменными сообщения .... Не совсем весело.

Edit:

Возможно, он МОЖЕТ работать с чем-то вроде:

<%= form_tag( { :action => 'upload' }, :multipart => true ) %>
  <br />
<%= text_field "Title", "title"%>

<%=calendar_date_select_tag :publishing_date %> 



  <%= submit_tag( "Submit" ) %>
<%= end_form_tag %>

или что-то еще (другой способ сделать теги, в отличие от "form_for", который вы использовали)

http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

В любом случае, по крайней мере, так, как вы это называли:

<%=calendar_date_select_tag f.text_field :publishing_date %> <!--This way of save/assigning doesn't work -->

совершенно неправильно, так как вы включили туда "f.text_field", что может быть опечаткой? Как это может быть тег выбора И текстовое поле? Кто знает, может быть, просто избавиться от этого поможет (хотя это все еще не связано с формой, если вы не выполните <% form_tag%>

...