问题描述
在Rails应用程序中提交表单时遇到问题。模型中的该字段没有验证。
这是它们张贴到控制器时的参数
"blast"=>{"to"=>"[947363,947426,947427,947432,947433]"}
这是提交给数据库的内容
["to","{\" 947426\",\" 947427\",\" 947432\"}"]
编辑:
控制器代码:
def update
if @blast.update(blast_params)
redirect_to URI.unescape(params[:ref]) if params[:ref].present?
end
end
private
def blast_params
params.require(:blast).permit(:subject,:to,:from_name,:from_email,:body,:json,:name,:active)
end
型号代码:
class Blast < ApplicationRecord
end
查看:
<%= form_for Blast.new,url: blasts_create_path,html: {class: "validetta"} do |f| %>
<%= f.hidden_field :subject,value: blast.subject %>
<%= f.hidden_field :from_name,value: blast.from_name %>
<%= f.hidden_field :from_email,value: blast.from_email %>
<%= f.hidden_field :to,value: blast.to %>
<%= f.hidden_field :body,value: blast.body %>
<%= f.hidden_field :json,value: blast.json.to_s %>
<div class="form-group">
<%= f.text_field :name,value: "#{blast.name} (copy)",class: "form-control input-lg",data: {'validetta' => 'required'} %>
</div>
<div class="text-center">
<button type="submit" class="btn btn-md btn-success waves-effect waves-light" aria-expanded="false">Next Step <i data-feather="arrow-right-circle" width="15" height="15" style="vertical-align:middle;top:-1px;position:relative;" class="m-l-5"></i></button>
</div>
<% end %>
数据库中的:to字段:
t.text "to",default: [],array: true
如您所见,它似乎从字符串中删除了第一个和列表项。有人遇到过类似的问题吗?
解决方法
这里的问题是关于在DOM上呈现数组时将数组序列化为字符串,然后在将其作为参数传递给控制器时又返回数组。
如下更新控制器:
def create
blast = @account.blasts.create(blast_params)
if blast
if params[:blast][:to].present?
blast_to_params = params[:blast][:to].gsub('[','').gsub(']','').split(',').map{|i| i.to_i}
blast.update(to: blast_to_params)
end
redirect_to blasts_step_1_path(blast)
else
redirect_to blasts_path,alert: "Failed to create this blast."
end
end
,
array: true
表示将数据存储为Postgres array,但是blast_params[:to]
的格式设置为JSON。 Rails将JSON字符串作为Postgres数组插入其中,并且翻译中丢失了一些东西。另外,您正在将整数输入文本列,因此将其挂在空格上。
[1] pry(main)> blast = Blast.new("to"=>"[947363,947426,947427,947432,947433]")
=> #<Blast:0x00007fa23091ff58
id: nil,to: [" 947426"," 947427"," 947432"],created_at: nil,updated_at: nil>
您可以通过首先将JSON解析为Ruby数组来解决此问题。然后,Rails会将其转换为Postgres数组。并且您应该将列类型切换为整数。 t.integer "to",default: [],array: true
。
[1] pry(main)> blast = Blast.new("to"=>JSON.parse("[947363,947433]"))
=> #<Blast:0x00007fa233ad0b38
id: nil,to: [947363,947433],updated_at: nil>
建议不要将其存储为the more flexible jsonb:t.jsonb "to",default: []
,而不要使用Postgres数组。您仍然必须解析传入的JSON,但是它将正确接受文本和整数的混合。