Rails не заполняет динамически сгенерированные поля при ошибке при публикации - PullRequest
1 голос
/ 27 апреля 2011

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

В контроллере у нас есть следующий метод для его заполнения:

  def build_my_registration_type_memberships                                                                                                            
    @memberships = []                                                                                                                                     
    ListCache.my_registration_types.each do |my_registration_type|                                                                                   
     @memberships << MyRegistrationTypeMembership.find_or_initialize_by_my_id_and_my_registration_type_id( @my.id, my_registration_type.id )
    end                                                                                                                                                      end

В вышеописанном методе, когда моя регистрация открывается в режиме редактирования / просмотра, она показывает значения, используя этот метод @membership. Но при публикации в случае ошибки это не перезагружает это с правильной информацией. Итак, мой вопрос: как я могу заново заполнить @membership в случае ошибки при публикации?

Спасибо за помощь.

1 Ответ

0 голосов
/ 27 апреля 2011

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

Я полагаю, у вас должен быть блок response_to в вашем методе create. И вы делаете это:

def create
  ...

  respond_to do |format|
      if @patient.save
        format.html { redirect_to @object, :notice => "Object was successfully saved." }
        format.xml  { render :xml => @object, :status => :created, :location => @object }
      else
        format.html { render :action => :new }
        format.xml  { render :xml => @patient.errors, :status => :unprocessable_entity }
      end
    end
end

Как вы можете заметить, в части else новое действие только что выполнено. Используя некоторый шаблон, представление только что доставлено. Теперь вам просто нужно сделать все, что вы делаете в новом действии, чтобы сделать эти значения доступными, в части else .

def create
  ...

  respond_to do |format|
    if @patient.save
      format.html { redirect_to @object, :notice => "Object was successfully saved." }
      format.xml  { render :xml => @object, :status => :created, :location => @object }
    else
      format.html { 
        @memberships = []
        ListCache.my_registration_types.each do |my_registration_type|                                          
          @memberships << MyRegistrationTypeMembership.find_or_initialize_by_my_id_and_my_registration_type_id( @my.id, my_registration_type.id )
        end
        render :action => :new 
      }
      format.xml  { render :xml => @patient.errors, :status => :unprocessable_entity }
    end
  end
end

И требуемые значения будут доступны в отображаемой форме.

Лучше, вы переходите к этому коду к фильтру перед или к чему-то, что делает эти значения доступными для этих двух методов (new и create).

...