Игнорирование модели со всеми пустыми полями в Ruby on Rails - PullRequest
1 голос
/ 11 января 2011

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

#item.rb
class Item < ActiveRecord::Base
 attr_accessible :name, :content
 validates_presence_of :name, :content 
end

#items_controller.rb
class ItemsController < ApplicationController  

def new
  @items = Array.new(3){ Item.new } 
end

def create
 @items = params[:items].values.collect{|item|Item.new(item)}
 if @items.each(&:save!)
  flash[:notice] = "Successfully created item."
  redirect_to root_url
 else
  render :action => 'new'
 end
end

#new.html.erb
<% form_tag :action => 'create' do %>
 <%@items.each_with_index do |item, index| %>
  <% fields_for "items[#{index}]", item do |f| %>
  <p>
   Name: <%= f.text_field :name  %>
   Content: <%= f.text_field :content  %>
  </p>
  <% end %>
 <% end %>
 <%= submit_tag %>
<% end %>

Этот код работает, когда все поля для всех элементов заполнены в форме, но не работает, если какие-либо поля остаются пустыми (из-за проверок).Цель состоит в том, чтобы 1 или 2 элемента могли быть сохранены, даже если другие оставлены пустыми.

Я уверен, что есть простое решение, но я часами возился безрезультатно.Любая помощь приветствуется!

Ответы [ 2 ]

1 голос
/ 11 января 2011

Я бы сделал это:

class Item
  def empty?
    attributes.values.compact.empty?
  end
end

# in ItemsController
if @items.reject(&:empty?).all(&:save)

Пара замечаний:

  1. Вы использовали save!, но вы, вероятно, хотите save. save! вызовет исключение, если один из элементов будет недействительным, и вы просто увидите страницу с ошибкой вместо вашего new шаблона.
  2. Я заменил each на all. each не будет делать то, что вы намеревались - то есть вернуть true тогда и только тогда, когда все элементы проверены и сохранены. all делает именно это.
1 голос
/ 11 января 2011

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

@items.reject! { |item| item.attributes.values.compact.empty? }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...