首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rails-4验证指出,字段不能为空白,即使字段不是空白。

rails-4验证指出,字段不能为空白,即使字段不是空白。
EN

Stack Overflow用户
提问于 2014-03-11 19:36:35
回答 2查看 1.8K关注 0票数 1

我有一个带有验证的activerecord模型:body,presence: true。当表单被填充和赋值时,我得到{:body=>“不能是空白”},尽管主体实际上不是空白的。如果我从模型中删除验证并重新提交,则记录将被成功创建。为什么验证说body字段不是空的,它是空的。

控制器。

代码语言:javascript
复制
class SqlTemplatesController < ApplicationController

  def create
    @sql_template = SqlTemplate.new(sql_template_params)

     respond_to do |format|
        if @sql_template.save
         format.html { redirect_to @sql_template, notice: 'Sql template was successfully created.' }
    end
   end

   private
   def sql_template_params
      params.require(:sql_template).permit(:body, :path, :format, :locale, :handler, :partial)
   end

end

模型

代码语言:javascript
复制
class SqlTemplate < ActiveRecord::Base
  validates :body, :path, presence: true
  validates :format, inclusion: Mime::SET.symbols.map(&:to_s)
  validates :locale, inclusion: I18n.available_locales.map(&:to_s)
  validates :handler, inclusion: ActionView::Template::Handlers.extensions.map(&:to_s)

  def to_liquid
    SqlTemplateDrop.new(self)
  end

 def body=(text)
    if self[:handler] == 'liquid'
      @template = Liquid::Template.parse(text)
      self[:body] = Marshal.dump(@template)
    end
 end

 def render(options = {})
   template.render options
 end

 private

 def template
   return @body unless @body.nil?
   @body = Marshal.load(self[:body])
 end

end

rails控制台中,如果创建新记录并将body字段设置为字符串body => "message body"或液体标记(如body =>“{body}}”),则会引发错误{:body=>“不能为空”},但如果删除它们的验证,则会引发错误。

代码语言:javascript
复制
irb(main):016:0> a = SqlTemplate.create(:body => "{{body}", path => "mail/liquid_database_template", :format => "html", :locale => "en", :handler => "liquid", :partial => false)

(0.1ms)  begin transaction
(0.1ms)  rollback transaction

irb(main):016:0> a.errors.messages
 => {:body=>["can't be blank"]}

如果我删除了验证并提交了一个表单,所有这些都会正常工作,如下所示:

代码语言:javascript
复制
 Started POST "/sql_templates" for 127.0.0.1 at 2014-03-11 15:28:14 +0000
  Processing by SqlTemplatesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"GVsRbsCKSlcEMiL1AzXE0tT8LBCNhhoK6wSGzvnB80A=", "sql_template"=>{"body"=>"{{body}}", "path"=>"customer_mail/liquid_database_template", "format"=>"html", "locale"=>"en", "handler"=>"liquid", "partial"=>"0"}, "commit"=>"Create Sql template"}
  #<SqlTemplate id: nil, body: nil, path: "customer_mail/liquid_database_template", format: "html", locale: "en", handler: "liquid", partial: false, created_at: nil, updated_at: nil>
 (0.1ms)  begin transaction
 SQL (9.4ms)  INSERT INTO "sql_templates" ("created_at", "format", "handler", "locale", "path", "updated_at") VALUES (?, ?, ?, ?, ?, ?)  [["created_at", "2014-03-11 15:28:14.869619"], ["format", "html"], ["handler", "liquid"], ["locale", "en"], ["path", "customer_mail/liquid_database_template"], ["updated_at", "2014-03-11 15:28:14.869619"]]
 (621.4ms)  commit transaction
 Redirected to http://localhost:3000/sql_templates/7
 Completed 302 Found in 662ms (ActiveRecord: 630.9ms)

Started GET "/sql_templates/7" for 127.0.0.1 at 2014-03-11 15:28:15 +0000
  Processing by SqlTemplatesController#show as HTML
  Parameters: {"id"=>"7"}
  SqlTemplate Load (3.1ms)  SELECT  "sql_templates".* FROM "sql_templates"  WHERE  "sql_templates"."id" = ? LIMIT 1  [["id", 7]]
  Rendered sql_templates/show.html.erb within layouts/application (11.4ms)
  Completed 200 OK in 52ms (Views: 46.0ms | ActiveRecord: 3.1ms)

如果我将验证添加回并提交,它将失败,如下所示:

代码语言:javascript
复制
Started POST "/sql_templates" for 127.0.0.1 at 2014-03-11 14:34:22 +0000
 ActiveRecord::SchemaMigration Load (0.3ms)  SELECT "schema_migrations".* FROM  "schema_migrations"
 Processing by SqlTemplatesController#create as HTML
  Parameters: {"utf8"=>"✓",  "authenticity_token"=>"GVsRbsCKSlcEMiL1AzXE0tT8LBCNhhoK6wSGzvnB80A=", "sql_template"=> {"body"=>"{{body}}", "path"=>"customer_mail/liquid_database_template", "format"=>"html",  "locale"=>"en", "handler"=>"liquid", "partial"=>"0"}, "commit"=>"Create Sql template"}
    #<SqlTemplate id: nil, body: nil, path: "customer_mail/liquid_database_template", format: "html", locale: "en", handler: "liquid", partial: false, created_at: nil, updated_at: nil>
   (0.2ms)  begin transaction
 (0.2ms)  rollback transaction
  Rendered sql_templates/_form.html.erb (32.6ms)
  Rendered sql_templates/new.html.erb within layouts/application (57.1ms)
  Completed 200 OK in 208ms (Views: 143.0ms | ActiveRecord: 1.4ms)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-12 13:54:52

我自己解决的。问题在于body字段的setter方法。通常,rails会自动定义它,但是如果要重写它来做一些额外的事情(这里是这样的),我仍然需要将self:body = text设置在最前面。注意,text是通过表单传入字段的值。如果没有该验证存在,将失败。

代码语言:javascript
复制
def body=(text)
  self[:body] = text
end
票数 0
EN

Stack Overflow用户

发布于 2014-03-11 19:57:29

您的body设置器在handler的setter之前被调用。因此,当self[:handler]进入body=方法时,它将为零。

你可以试试这些

( i)更改散列的顺序

代码语言:javascript
复制
a = SqlTemplate.create(:handler => "liquid", :body => "{{body}", path =>   "mail/liquid_database_template", :format => "html", :locale => "en", :partial => false)

( ii)在设置处理程序后稍后设置主体

代码语言:javascript
复制
a = SqlTemplate.new(:handler => "liquid", path => "mail/liquid_database_template", :format => "html", :locale => "en", :partial => false)
a.body = "{{body}}"
a.save
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22334900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档