首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从多个表单字段中获取数据,然后以相同的表单将它们作为数组提交到单个数据库单元格中?

如何从多个表单字段中获取数据,然后以相同的表单将它们作为数组提交到单个数据库单元格中?
EN

Stack Overflow用户
提问于 2015-01-01 21:26:49
回答 2查看 1.4K关注 0票数 1

--这是我在Rails中表单的一部分:

代码语言:javascript
复制
    # 2 fields that should have values passed into an array
    <%= f.label "test1" %>       
    <%= text_field_tag(:test1) %>
    <%= f.label "test2" %>
    <%= text_field_tag(:test2) %>

    # hidden field to (hopefully) receive the array data (same form)
    <%= f.hidden_field :subtypes, :value => @subtypes %>

--这是我的控制器:

代码语言:javascript
复制
  def update
    if @anomaly.update(anomaly_params)
     redirect_to anomaly_path(@anomaly)
     flash[:success] = "You have successfully updated the anomaly"
    else
     render :edit
     flash[:error] = @anomaly.errors.full_messages
    end
  end

此方法将在各种方法之前运行:(文件顶部的before_action)

代码语言:javascript
复制
# before_action :subtypes_array, only: [:new, :edit, :create, :update]

def subtypes_array
  @subtypes = []
  field1 = params[:test1]
  field2 = params[:test2]
  @subtypes << field1
  @subtypes << field2
end

我在控制器中也有这样的信息:

代码语言:javascript
复制
# before_action :set_anomaly, only: [:show, :edit, :update, :destroy]
def set_anomaly
  @anomaly = Anomaly.find(params[:id])
end

我有Rails 4强对角,允许来自各个字段的数据通过。表单工作正常,但是来自两个字段的数据从未进入数据库.

我已经有了一个数据库列,它可以接收具有字符串值的数组:

代码语言:javascript
复制
class AddSubtypesToAnomalies < ActiveRecord::Migration
  def change
    add_column :anomalies, :subtypes, :string, array: true, default: []
  end
end

在控制台上,我可以没有问题地传递一个数组。

我在想该怎么做呢?

更新:

代码语言:javascript
复制
private
  def anomaly_params
    params.require(:anomaly).permit(:test1, :test2, :name, :description, :subtypes)
  end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-01 22:26:27

您的text_field_tags需要嵌套在对象下面。

代码语言:javascript
复制
<%= text_field_tag("anomaly[test1]") %>
<%= text_field_tag("anomaly[test2]") %>

这是因为您使用的form_for设置了异常下的所有其他字段。anomaly_params只抓取更新方法中的异常下面的内容。

更新

由于您在DB字段中使用了Array,并且选择了对Array使用多个字段,所以需要在create和update控制器方法中捕获它。使用我在这里编写的相同的text_field_tags,您可以这样做:

代码语言:javascript
复制
def create
  
  create_subtypes
  
  if @anmaly.save(anomaly_params)
  ...

def update

  create_subtypes

  if @anomaly.update(anomaly_params)
  ...

private
def create_subtypes
  params['anomaly']['subtypes'] = Array(params['anomaly']['subtypes']) << params['anomaly'].delete('test1')
  params['anomaly']['subtypes'] = Array(params['anomaly']['subtypes']) << params['anomaly'].delete('test2')
end

若要在数组开始处处理空项,请执行以下操作:

代码语言:javascript
复制
def create_subtypes
  params['anomaly']['subtypes'] = Array(params['anomaly']['subtypes'].presence).compact << params['anomaly'].delete('test1')
  params['anomaly']['subtypes'] = Array(params['anomaly']['subtypes'].presence).compact << params['anomaly'].delete('test2')
end

只创建一个正规的:子类型表单字段,让用户手动输入他们自己的逗号分隔列表,而不是使用test1和test2,可能会更容易。

票数 1
EN

Stack Overflow用户

发布于 2015-01-02 10:28:56

您必须告诉您的控制器,subtypes参数是一个数组,否则将不会以数组的形式处理它,而且由于您有强参数,因此可以这样做:

代码语言:javascript
复制
private
  def anomaly_params
    params.require(:anomaly).permit(:test1, :test2, :name, :description, :subtypes=> [])
  end

还可以对参数使用完整的散列标签。

代码语言:javascript
复制
field1 = params[:anomaly][:test1]
field2 = params[:anomaly][:test2]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27734841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档