Несколько объектов в форме направляющих

Это именно тот код, который работал для меня:

<p>You'll be automatically redirected in <span id="count">10</span> seconds...</p>

<script type="text/javascript">

window.onload = function(){

(function(){
  var counter = 10;

  setInterval(function() {
    counter--;
    if (counter >= 0) {
      span = document.getElementById("count");
      span.innerHTML = counter;
    }
    // Display 'counter' wherever you want to display it.
    if (counter === 0) {
    //    alert('this is where it happens');
        clearInterval(counter);
    }

  }, 1000);

})();

}

</script>

<meta http-equiv="refresh" content="10;url=http://www.example.com" />

Надеюсь, это поможет;)

50
задан Espen 9 June 2009 в 11:40
поделиться

2 ответа

ОБНОВЛЕНИЕ : этот ответ относится к Rails 2 или если у вас есть особые ограничения, требующие настраиваемой логики. Простые случаи хорошо решаются с помощью fields_for, как обсуждалось в другом месте.

Rails не очень поможет вам в этом. Это противоречит стандартным соглашениям о представлении, поэтому вам придется искать обходные пути в представлении, контроллере и даже маршрутах. Это не весело.

Ключевыми ресурсами по работе с многомодельными формами в стиле Rails являются серия params-foo Стивена Чу , или, если вы используете Rails 2.3, посмотрите Nested Object Forms

Это станет намного проще, если вы определите какой-то особый ресурс, который вы редактируете, например, фотосет. Фотосет может быть настоящим, Тип модели ActiveRecord или это может быть просто фасад, который принимает данные и выдает ошибки, как если бы это была модель ActiveRecord.

Теперь вы можете написать форму представления примерно так:

<%= form_for :photoset do |f|%>
  <% f.object.photos.each do |photo| %>
    <%= f.fields_for photo do |photo_form| %>
      <%= photo_form.text_field :caption %>
      <%= photo_form.label :caption %>
      <%= photo_form.file_field :attached %>
    <% end %>
  <% end %>
<% end %>

Ваша модель должна проверять каждую дочернюю фотографию, которая приходит и обобщает их ошибки. Вы можете прочитать хорошую статью о том, как включить проверки в любой класс . Это может выглядеть примерно так:

class Photoset
  include ActiveRecord::Validations
  attr_accessor :photos

  validate :all_photos_okay

  def all_photos_okay
    photos.each do |photo|
      errors.add photo.errors unless photo.valid?
    end
  end

  def save
    photos.all?(&:save)
  end

  def photos=(incoming_data)
    incoming_data.each do |incoming|
       if incoming.respond_to? :attributes
         @photos << incoming unless @photos.include? incoming
       else
         if incoming[:id]
            target = @photos.select { |t| t.id == incoming[:id] }
         end
         if target
            target.attributes = incoming
         else
            @photos << Photo.new incoming 
         end
       end
    end
  end

  def photos
     # your photo-find logic here
    @photos || Photo.find :all
  end
end

Используя модель фасада для Фотосета, вы можете сделать свой контроллер и логику представления простой и понятной, сохранив самый сложный код для специальной модели. Этот код, вероятно, не выйдет из коробки, но, надеюсь, он даст вам некоторые идеи и укажет правильное направление для решения вашего вопроса.

<%= form_for :photoset do |f|%>
  <% f.object.photos.each do |photo| %>
    <%= f.fields_for photo do |photo_form| %>
      <%= photo_form.text_field :caption %>
      <%= photo_form.label :caption %>
      <%= photo_form.file_field :attached %>
    <% end %>
  <% end %>
<% end %>

Ваша модель должна проверять каждую приходящую дочернюю фотографию и объединять их ошибки. Вы можете прочитать хорошую статью о том, как включить проверки в любой класс . Это может выглядеть примерно так:

class Photoset
  include ActiveRecord::Validations
  attr_accessor :photos

  validate :all_photos_okay

  def all_photos_okay
    photos.each do |photo|
      errors.add photo.errors unless photo.valid?
    end
  end

  def save
    photos.all?(&:save)
  end

  def photos=(incoming_data)
    incoming_data.each do |incoming|
       if incoming.respond_to? :attributes
         @photos << incoming unless @photos.include? incoming
       else
         if incoming[:id]
            target = @photos.select { |t| t.id == incoming[:id] }
         end
         if target
            target.attributes = incoming
         else
            @photos << Photo.new incoming 
         end
       end
    end
  end

  def photos
     # your photo-find logic here
    @photos || Photo.find :all
  end
end

Используя модель фасада для Фотосета, вы можете сделать свой контроллер и логику представления простой и понятной, сохранив самый сложный код для специальной модели. Этот код, вероятно, не выйдет из коробки, но, надеюсь, он даст вам некоторые идеи и укажет правильное направление для решения вашего вопроса.

<%= form_for :photoset do |f|%>
  <% f.object.photos.each do |photo| %>
    <%= f.fields_for photo do |photo_form| %>
      <%= photo_form.text_field :caption %>
      <%= photo_form.label :caption %>
      <%= photo_form.file_field :attached %>
    <% end %>
  <% end %>
<% end %>

Ваша модель должна проверять каждую приходящую дочернюю фотографию и объединять их ошибки. Вы можете прочитать хорошую статью о том, как включить проверки в любой класс . Это может выглядеть примерно так:

class Photoset
  include ActiveRecord::Validations
  attr_accessor :photos

  validate :all_photos_okay

  def all_photos_okay
    photos.each do |photo|
      errors.add photo.errors unless photo.valid?
    end
  end

  def save
    photos.all?(&:save)
  end

  def photos=(incoming_data)
    incoming_data.each do |incoming|
       if incoming.respond_to? :attributes
         @photos << incoming unless @photos.include? incoming
       else
         if incoming[:id]
            target = @photos.select { |t| t.id == incoming[:id] }
         end
         if target
            target.attributes = incoming
         else
            @photos << Photo.new incoming 
         end
       end
    end
  end

  def photos
     # your photo-find logic here
    @photos || Photo.find :all
  end
end

Используя модель фасада для Фотосета, вы можете сделать свой контроллер и логику представления простой и понятной, сохранив самый сложный код для специальной модели. Этот код, вероятно, не выйдет из коробки, но, надеюсь, он даст вам некоторые идеи и укажет правильное направление для решения вашего вопроса.

вы можете сделать свой контроллер и логику простой и понятной, оставив самый сложный код для специальной модели. Этот код, вероятно, не выйдет из коробки, но, надеюсь, он даст вам некоторые идеи и укажет правильное направление для решения вашего вопроса.

вы можете сделать свой контроллер и логику простой и понятной, оставив самый сложный код для специальной модели. Этот код, вероятно, не выйдет из коробки, но, надеюсь, он даст вам некоторые идеи и укажет правильное направление для решения вашего вопроса.

48
ответ дан 7 November 2019 в 10:30
поделиться

Вы можете использовать синтаксис «название модели []» для представления нескольких объектов.

В поле зрения используйте "фото []" в качестве названия модели.

<% form_for "photo[]", :url => photos_update_path do |f| %>
  <% for @photo in @photos %>
    <%= render :partial => "photo_form", :locals => {f => f} %>
    <%= submit_tag "Save"%>
  <% end %>
<% end %>

Это заполнит поля ввода, как вы описали.

В вашем контроллере вы можете выполнять массовые обновления.

def update
  Photo.update(params[:photo].keys, params[:photo].values)
  ...
end 
16
ответ дан 7 November 2019 в 10:30
поделиться
Другие вопросы по тегам:

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