轨。允许文本,验证它,制作数组并保存到postgres。怎么样?

时间:2013-12-25 00:47:49

标签: ruby-on-rails arrays postgresql ruby-on-rails-4

我有textarea的Rails表单。用户将文本分割为逗号,然后提交给服务器,数据验证,分割到数组并写入postgres数据库。

但回调before_validation中有空数组。就是这样:

class UsersController < ApplicationController

def update
  @user = User.find(params[:id])
  if @user.update(user_params)
    # show profile
  end
end

private
  def user_params
    params.require(:user).permit(
      :nickname,
      :password,
      {tags:[]})
  end

class User < ActiveRecord::Base

  before_validation :tags_must_be_list

  def tags_must_be_list
    p tags ####### here is tags is empty [], but need to be text
    errors.add(:tags, "is not list")
  end

怎么了?

1 个答案:

答案 0 :(得分:0)

你说这些标签应该是一个数组:

params.require(:user).permit(
  :nickname,
  :password,
  {tags:[]}) # <--------- `:tags` is supposed to be an array

但标签是以单个CSV字符串而不是数组形式出现的,所以可能是因为字符串不是数组而被过滤掉了。

有多种选择:

  1. 使用一些JavaScript将字符串拆分为客户端上的单个标记,并重写表单(使用JavaScript)以提交单个tags[]参数而不是单个tags字符串。
  2. 说出permit(:nickname, :password, :tags),然后将标签分成控制器中的数组:

    user = user_params
    user[:tags] = user.delete(:tags).to_s.split(/\s*,\s*/)
    @user.update(user)
    
  3. 提供您自己的User#tags=方法,以便在存储标记之前拆分字符串(如果标记已经不是数组,则可能使用before_validation挂钩对数组进行排序。您还需要在{strong} 2 进行permit更改,我不确定在您的before_validation挂钩运行之前,AR会对您的字符串做什么,{{1覆盖应该合理地工作。

  4. 我可能会选择 2 ,但很多人会认为异端并且用 3 来臃肿模型。