2014-03-04 35 views
1
保存值

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

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

我知道这听起来有些不可思议不添加在信息表中的另一附加字段,但我努力只是单独使用地址栏。我试图在显示中显示两个值,但只显示最后一个值,我猜想第一个地址没有保存,但最后一个总是保存而不是两个。

我的节目HTML

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

我怎样才能既值保存到从两个输入字段的表,并在我的节目展示他们俩。 HTML?如果任何人都可以提供一种方法或解决方案,我会感激。

UPDATE

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 

回答

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属性 - 你所做的只是修改字段在表单中的处理方式,然后相应地处理控制器中的返回值。

UPDATE

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 
+0

我在我的控制器set_info或info_params –

+0

@CalvinJones中调整了什么方法,请参阅我的更新以获取有关如何修改您的'params'哈希值的详细信息。一旦你这样做了,你可以像往常一样将值传递给新的对象实例。 – zeantsoi

+0

非常感谢你的帮助。现在,我在create方法的第一行得到了nil:NilClass的未定义方法'[]'。我很新的轨道 –

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散列中抽出并制作柱子n你自己的数据。

+0

查看你有地址1和地址2,我猜你不能只使用两个输入字段的地址。我看到http://stackoverflow.com/questions/8556888/ruby-on-rails-multiple-same-input-fields-in-same-form这一个非常相似,但不知道什么content_array是或如何显示它 –

+0

有几种不同的方法可以做到这一点,不管怎么样,尽管你将不得不在某处操作数据。在数据库中使用单独的列确实是最简单的方法。你有没有理由把它们结合起来? –

+0

没理由我只想在我的节目中以某种方式显示两个值,使用一列感谢输入和帮助花花公子 –

相关问题