【问题标题】:Rails doesn't populate dynamic generated fields on error on postingRails 不会在发布错误时填充动态生成的字段
【发布时间】:2011-04-27 09:26:42
【问题描述】:

在我们的 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?

感谢您的帮助。

【问题讨论】:

  • 您能否发布保存对象的控制器方法或如果未保存则呈现错误
  • 好的。这是控制器代码:code def new @my = My.new(params[:my]) @form_details = FormDetail.new(params[:form_detail]) end 当我的注册页面被访问时调用它。单击保存后,它会调用:code def create if @my.save flash[:notice] = "'#{@my.name}' was successfully created." redirect_to :action => "index" else build_my_registration_type_memberships flash[:error] = "请填写所有必填字段" render :action => "new" end end

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


【解决方案1】:

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

我假设您的 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

而且,您想要的值将以呈现的形式提供。

更好的是,您可以将该代码移至前置过滤器或其他东西,这使得这些值可用于这两种方法(新建和创建)。

【讨论】:

  • 让我换句话来详细说明这个问题。我试图显示的会员数据是一组复选框和文本框(分别是类型和价格),我需要从 db 生成。当验证启动时,用户输入的其他文本框值将保留在表单上,​​但我无法获取成员复选框和文本框的值。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 2017-12-17
  • 2017-11-21
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
相关资源
最近更新 更多