--这是我在Rails中表单的一部分:
# 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 %>--这是我的控制器:
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)
# before_action :subtypes_array, only: [:new, :edit, :create, :update]
def subtypes_array
@subtypes = []
field1 = params[:test1]
field2 = params[:test2]
@subtypes << field1
@subtypes << field2
end我在控制器中也有这样的信息:
# before_action :set_anomaly, only: [:show, :edit, :update, :destroy]
def set_anomaly
@anomaly = Anomaly.find(params[:id])
end我有Rails 4强对角,允许来自各个字段的数据通过。表单工作正常,但是来自两个字段的数据从未进入数据库.。
我已经有了一个数据库列,它可以接收具有字符串值的数组:
class AddSubtypesToAnomalies < ActiveRecord::Migration
def change
add_column :anomalies, :subtypes, :string, array: true, default: []
end
end在控制台上,我可以没有问题地传递一个数组。
我在想该怎么做呢?
更新:
private
def anomaly_params
params.require(:anomaly).permit(:test1, :test2, :name, :description, :subtypes)
end发布于 2015-01-01 22:26:27
您的text_field_tags需要嵌套在对象下面。
<%= text_field_tag("anomaly[test1]") %>
<%= text_field_tag("anomaly[test2]") %>这是因为您使用的form_for设置了异常下的所有其他字段。anomaly_params只抓取更新方法中的异常下面的内容。
更新
由于您在DB字段中使用了Array,并且选择了对Array使用多个字段,所以需要在create和update控制器方法中捕获它。使用我在这里编写的相同的text_field_tags,您可以这样做:
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若要在数组开始处处理空项,请执行以下操作:
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,可能会更容易。
发布于 2015-01-02 10:28:56
您必须告诉您的控制器,subtypes参数是一个数组,否则将不会以数组的形式处理它,而且由于您有强参数,因此可以这样做:
private
def anomaly_params
params.require(:anomaly).permit(:test1, :test2, :name, :description, :subtypes=> [])
end还可以对参数使用完整的散列标签。
field1 = params[:anomaly][:test1]
field2 = params[:anomaly][:test2]https://stackoverflow.com/questions/27734841
复制相似问题