在表单中使用相同的输入字段保存值

时间:2014-03-04 03:23:53

标签: ruby-on-rails ruby

我在带有info的导轨中有一个名为address:string的模型,在我看来,我有一个输入字段,用户可以输入一个值。继承人我的form.html

<%= form_for(@info) do |f| %>
  <%= f.text_field :address %>
  <%= f.text_field :address %>
<% end %>

我知道不在info表中添加另一个字段听起来很奇怪,但我正在努力只使用地址列。我试图在节目中显示两个值,但只显示最后一个,我猜第一个地址没有保存,但最后一个地址总是保存而不是两者。

我的节目html

<p>
  <strong>Addresses:</strong>
  <%= @info.address %>
</p>

如何从两个输入字段将两个值保存到表中,并在我的节目中显示它们。 HTML?如果有人能提供方法或解决方案,我将感激不尽。

更新

def create
   address_array = params[:info][:address]
   address_string = address_array[0] + ', ' + address_array[1]
   params[:info][:address] = address_string

    respond_to do |format|
      if @info.save
        format.html { redirect_to @info, notice: 'Info was successfully created.' }
        format.json { render action: 'show', status: :created, info: @info }
      else
        format.html { render action: 'new' }
        format.json { render json: @info.errors, status: :unprocessable_entity }
      end
    end
  end

2 个答案:

答案 0 :(得分:1)

尝试这样的事情:

<%= form_for :info do |f| %>
    <%= f.text_field :address1 %>
    <%= f.text_field :address2 %>
<% end %>

然后在你的控制器中:

def create
    # Look up model object

    address = "#{params[:info][:address1]} #{params[:info][:address2]}"

    # save model object with address
  end

基本思想是在不使用模型属性的情况下创建表单,然后在控制器中从params哈希中提取所需信息并自行创建列数据。

答案 1 :(得分:1)

如果您不想完全创建两个单独的地址字段,则可以将相同的address参数作为数组传递给两个标记帮助程序中的每一个:

<%= f.text_field_tag 'address[]' %>
<%= f.text_field_tag 'address[]' %>

然后,在您的控制器中,您可以访问两个字段中每个字段的相应值作为数组成员:

address_array = params[:address]
address_string = address_array[0] + ', ' + address_array[1] # Assigns comma delimited string

此后,您可以将address_string作为模型的address属性的值。

如果您不想更改模型架构,那么这种方法有相当大的优势,因为您可以按原样使用address属性 - 您所做的只是修改字段的处理方式表单,然后相应地处理控制器中的返回值。

<强>更新

params哈希可以就地修改,以便params[:info][:address]反映您的自定义字符串,而不是两个字符串的数组:

def create
    address_array = params[:address]
    address_string = address_array[0] + ', ' + address_array[1]
    params[:info][:address] = address_string # Assigns `address_string` to `params[:info][:address]`
    # remainder of the `create` logic
end

更新2

您的newcreate控制器操作应该类似于此:

def new
   @info = Info.new
end

def create
   address_array = params[:address]
   address_string = address_array[0] + ', ' + address_array[1]
   params[:info][:address] = address_string

  respond_to do |format|
    # First, instantiate a new instance of `Info`
    @info = Info.new(params[:info])
    # Then, save
    if @info.save
      format.html { redirect_to @info, notice: 'Info was successfully created.' }
      format.json { render action: 'show', status: :created, info: @info }
    else
      format.html { render action: 'new' }
      format.json { render json: @info.errors, status: :unprocessable_entity }
    end
  end
end

更新3

如果您在修改params哈希值时遇到问题,可能需要尝试直接分配address属性:

def create
   address_array = params[:address]
   address_string = address_array[0] + ', ' + address_array[1]

  respond_to do |format|
    @info = Info.new(params[:info])
    @info.address = address_string # Assign attribute directly
    if @info.save
    # remainder of code