我有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
怎么了?
答案 0 :(得分:0)
你说这些标签应该是一个数组:
params.require(:user).permit(
:nickname,
:password,
{tags:[]}) # <--------- `:tags` is supposed to be an array
但标签是以单个CSV字符串而不是数组形式出现的,所以可能是因为字符串不是数组而被过滤掉了。
有多种选择:
tags[]
参数而不是单个tags
字符串。说出permit(:nickname, :password, :tags)
,然后将标签分成控制器中的数组:
user = user_params
user[:tags] = user.delete(:tags).to_s.split(/\s*,\s*/)
@user.update(user)
提供您自己的User#tags=
方法,以便在存储标记之前拆分字符串(如果标记已经不是数组,则可能使用before_validation
挂钩对数组进行排序。您还需要在{strong} 2 进行permit
更改,我不确定在您的before_validation
挂钩运行之前,AR会对您的字符串做什么,{{1覆盖应该合理地工作。
我可能会选择 2 ,但很多人会认为异端并且用 3 来臃肿模型。