сохранить дочерние поля при неудачной проверке? - PullRequest
0 голосов
/ 16 октября 2011

Я использую Formtastic, как это

class Court < ActiveRecord::Base
  belongs_to :tournament    
end

class Tournament < ActiveRecord::Base
  has_many  :courts, :dependent => :destroy
  accepts_nested_attributes_for :courts, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true
  validates :name, :presence => true, :length => { :maximum => 100 }
end

и все работает нормально, но при неудачной валидации турнирной формы созданные корты не сохраняются в неудачной форме.

вот мой контроллер

def new
  @tournament = Tournament.new
  1.times do
    @tournament.courts.build
  end

def create
  @tournament = Tournament.new(params[:tournament])

Я предполагал, что мог бы сделать что-то подобное в процессе создания, но не смог

    if params[:tournament][:courts_attributes]
         params[:tournament][:courts_attributes].each { |attribute| 
             @tournament.courts.build(attribute)
        }
      end


<%= semantic_form_for @tournament do |f| %>
  <%= f.inputs do %>
    <%= f.input :number_courts, :hint => "How many courts are available?" %>

        <%= f.semantic_fields_for :courts do |builder| %>
            <%= render :partial => "court_fields", :locals => { :f => builder } %>
            <span class="links">
             <%= link_to_add_fields "Add More Court", f, :courts %>
            </span>
        <% end %>

частичный

<div class="nested_fields">
<%= f.input :name %>
<%= f.input :address %>
<%= f.input :city %>
<%= f.input :state %>
<%= f.input :zip %>
<%= f.input :phone %>
<%= f.input :contact_name %>
<%= link_to_remove_fields "Remove Court", f %>
</div>

UPDATE ---

вот мое действие по созданию

def create
  @tournament = Tournament.new(params[:tournament])
  respond_to do |format|
    if @tournament.save
      format.html { redirect_to @tournament, notice: 'Tournament was successfully created.' }
      format.json { render json: @tournament, status: :created, location: @tournament }
    else
      format.html { render action: "new" }
        end

также здесь есть параметры на всякий случай, которые помогут

Processing by TournamentsController#create as HTML
 Parameters: {"utf8"=>"✓", "authenticity_token"=>"xv+p7QdpkJdEUaTGqrKue63869hlwh3Zv1xvkO5qx6A=", "tournament"=>{"name"=>"", "sport_id"=>"1", "entry_fee"=>"", "start_date"=>"", "end_date"=>"", "number_courts"=>"", "courts_attributes"=>{"0"=>{"name"=>"hello", "_destroy"=>"false"}, "1318725283928"=>{"name"=>"asdfsadfas", "_destroy"=>"false"}, "1318725286739"=>{"name"=>"asdfasdfa", "_destroy"=>"false"}}, "available_times"=>"", "available_end_times"=>"", "min_games"=>"", "time_allowed"=>"1:15", "number_teams_per_bracket"=>"1", "gender_id"=>"1", "entry_deadline"=>"", "age_limit"=>"", "rules"=>"", "coach_meeting"=>"0", "meeting_location"=>"", "meeting_date"=>"", "future_tournament"=>"0", "private_service"=>"0", "add_blog"=>"0"}, "commit"=>"Create Tournament"}

любые идеи о том, как сохранить данные после неудачной проверки

1 Ответ

2 голосов
/ 16 октября 2011

Я предполагаю, что когда вы пытаетесь создать Турнир, и проверка не проходит, его дочерние суды фактически не создаются.Вам нужно, чтобы данные Суда, введенные в форму Турнира, сохранялись при каждой попытке создания.Это звучит правильно?

Я не использовал форматирование.Однако, если его API на самом деле состоит только из оберток вокруг помощников форм Rails, то я бы попробовал:

    <%= f.semantic_fields_for :courts do |builder| %>
        <%= render :partial => "court_fields", :collection => @tournament.courts, :locals => { :f => builder } %>
        <span class="links">
         <%= link_to_add_fields "Add More Court", f, :courts %>
        </span>
    <% end %>    

Обратите внимание на частичное изменение рендеринга полей суда.

Когда вы пытаетесь создать турнир, это должно сделать построенный вами корт TournamentsController.new.Если попытка не удалась, она должна отобразить суды, которые были введены во время первой попытки.

...