Как мне справиться с этим вариантом использования Rails? - PullRequest
2 голосов
/ 14 сентября 2011

У меня есть модель Exercise, в которой есть следующие столбцы (псевдо-Ruby):

model Exercise do
  string :name
  calories_burned :float
end

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

  • если существуют предыдущие упражнения
    • показать элемент select с именами существующих добавленных
    • показать флажок, позволяющий добавить новый, переключая вход поле в текстовое поле
  • еще
    • показать текстовое поле

Дело в том, что я не знаю, как мне это выразить. Вот как обрабатывается случай else:

<div class="field">
  <%= f.label :name %><br />
  <%= f.text_field :name %>
</div>

У меня сейчас что-то вроде этого:

  <div class="field">
    <% if @exercise_added %>
        <div id="select_div">
            <%= select_tag :name,options_for_select(@exercise_added) %>
            <input type="checkbox" name="custom_type_checked" id="which_type">New type?</input>
        </div>
    <% end %>
    <div id="regular_field">
        <%= f.label :name %><br />
        <%= f.text_field :name %>
    </div>
  </div>

В @exercise_added у меня есть список имен всех упражнений из базы данных. Каков наилучший / самый чистый способ справиться с этим?

РЕДАКТИРОВАТЬ: На данный момент у меня есть текстовое поле и выбор, и с помощью Javascript я изменяю имя элемента (и скрываю другое). Пока что это работает, но мне все равно было бы интересно, существуют ли другие подходы.

Ответы [ 4 ]

4 голосов
/ 19 сентября 2011

Вы можете проверить, является ли массив @exercise_added пустым или нет, и показать поле выбора или текстовое поле соответственно.

      <div class="field">
        <% if !@exercise_added.empty? %>
            <div id="select_div">
                <%= select_tag :name,options_for_select(@exercise_added) %>
                <input type="checkbox" name="custom_type_checked" id="which_type">New type?</input>
            </div>
        <% else %>
        <div id="regular_field">
            <%= f.label :name %><br />
            <%= f.text_field :name %>
        </div>
        <%end%>
      </div>
0 голосов
/ 20 сентября 2011

Что если вы использовали две формы?Одна форма для обработки случая, когда упражнение находится в @exercise_added, и вторая форма для обработки создания нового упражнения.Это может даже сводиться к разнице между POST и PUT, в зависимости от того, что вы делаете после отправки упражнения из выпадающего списка.

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

0 голосов
/ 17 сентября 2011

По умолчанию у меня будет окно выбора и кнопка со скрытым текстовым полем, если переменная @show_textbox не имеет значения true. Как то так:

<div class="field">
    <div id="select_div">
        <%= select_tag :name,options_for_select(@exercise_added) %>
        <%= f.submit "New Exercise" %>
    </div>
    <div id="regular_field" <%= hidden_unless @show_textbox %> >
        <%= f.label :name %><br />
        <%= f.text_field :name %>
    </div>
</div>

Где я написал вспомогательную функцию

def hidden_unless cond
  raw "style=\"display: none;\"" unless cond
end

# this one is helpful, too
def hidden_if cond
  raw "style=\"display: none;\"" if cond
end

Затем в моем контроллере проверьте, была ли нажата кнопка «Новое упражнение». Если это так, то по существу установите @show_textbox в значение true, а затем повторно отредактируйте форму new.

def create
  # .....

  # did we get here because the user pressed "New Exercise"?
  if params[:commit].eql?("New Exercise")
    @show_textbox = true
    # probably some other code to replicate what happens in your #new action
    render :action => new
  end

  # ....
end

Вы можете проверить в своем контроллере, есть ли в поле :name какой-либо текст, и использовать его для переопределения поля выбора.

Это должно работать без JavaScript. Я бы добавил jQuery, чтобы заменить кнопку ссылкой или флажком, с обработчиком щелчка для этого, который подключен к функции, которая отображает текстовое поле, т.е. $('#regular_field').toggle();.

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

0 голосов
/ 15 сентября 2011

Вы должны внимательно посмотреть на это Railscast следующую часть ).Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...