Rails中是否存在一些验证,可以在将字符串提交到数据库之前先对其进行编辑?

问题描述

在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 jsonbt.jsonb "to",default: [],而不要使用Postgres数组。您仍然必须解析传入的JSON,但是它将正确接受文本和整数的混合。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...