Rails不会在发布时填充错误时填充动态生成的字段

时间:2011-04-27 09:26:42

标签: ruby-on-rails ruby post dynamic field

在我们的rails应用程序中,我们有一个页面,在提交时我们将数据保存在db中。在这个页面上,我们有一些动态生成的字段,我看到在页面重新加载时出现验证错误时,它不会使用发布时存在的值填充这些字段。

在控制器中,我们定义了以下方法来填充它:

  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 :(得分:0)

因为,我知道您希望新方法可用的某些值或创建失败后呈现的页面。

我假设您的create方法中必须包含respond_to块。而你正在这样做:

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)。