Rails:在提交失败后,将以前输入的联系人表单显示为

时间:2016-01-13 09:07:00

标签: ruby-on-rails forms

我的rails应用程序中有一个联系表单。如果表单未成功提交,我希望表单显示用户先前输入的输入。我猜我应该首先使用session来包含所有旧输入,但不确定我是否正确。

接下来的问题是,在页面刷新后,如何在联系表单上显示旧输入?

这是我的控制器文件中的代码:

def createMessage
   @message = Message.new(message_params)

  if @message.valid?
    MessageMailer.new_message(@message).deliver
    flash[:success] = "Thank you."
    redirect_to root_path
  else
    session[:message_error] = @message
    flash[:danger] = "An error occurred while delivering this message."
    redirect_to root_path
    @message = session[:message_error]
  end
end

这是我的表单布局:

<%= form_for @message, url: root_path do |message_form| %>
  <div class="form-inline">
     <%= message_form.text_field :first_name, :class => 'form-control', placeholder: "First Name*" %>
     <%= message_form.text_field :last_name, :class => 'form-control', placeholder: "Last Name*" %>
  </div>

  <div class="form-inline">
     <%= message_form.text_field :business_title, :class => 'form-control', placeholder: "Business Title" %>
     <%= message_form.text_field :business_name, :class => 'form-control', placeholder: "Business Name" %>
  </div>    

  <div class="form-inline">
     <%= message_form.text_field :phone, :class => 'form-control', placeholder: "Phone*" %>
     <%= message_form.email_field :email, :class => 'form-control', placeholder: "Email*"%>
  </div>     

  <div class="form-group">
     <%= message_form.text_field :street_address, :class => 'form-control', placeholder: "Street Address*" %>
  </div>

  <div class="form-group">
    <div class="input-group">
      <div class="input-group-addon">Singapore</div>
        <%= message_form.text_field :postal_code, :class => 'form-control', placeholder: "Postal Code*" %>
    </div>
  </div>                            

  <div class="form-group">       
     <%= message_form.text_area :content, :class => 'form-control', placeholder: "Additional information"%>
  </div>

  <div class="form-group">
     <%= message_form.submit "submit", :class => 'btn btn-default' %>
  </div>      

提前谢谢。

2 个答案:

答案 0 :(得分:3)

如果正确使用了form_for助手

,那么它就完全符合您的要求

new方法中,您会创建一个全新的空消息...

def new
  @message = Message.new
end

因此,当显示“新”视图时,所有字段都准备好进行新输入

在您的创建方法

def create

   @message = Message.new(message_params)

  if @message.valid?
    MessageMailer.new_message(@message).deliver
    flash[:success] = "Thank you."
    redirect_to root_path
  else
    flash.now[:danger] = "An error occurred while delivering this message."
    render :new
  end
end

请注意,我们正在使用包含输入值的@message对象进行render :new,因此会自动显示这些值。

编辑 - 请注意,Flash消息通常仅显示在redirect_to ...以显示render上需要使用flash.now...的快照消息

答案 1 :(得分:0)

首先,当你无法提交时,@ message变量为nil所以赋值变量是没用的。

其次,当你redirect_to时,你不能分配@message变量。

我不确定,但我认为您不能使用@message变量,相反,您可以将message_params保存到会话中,然后您可以在视图中处理它。