Rails 4 的 best_in_place gem 复选框问题(为啥字符串没有转换为布尔值?)
Posted
技术标签:
【中文标题】Rails 4 的 best_in_place gem 复选框问题(为啥字符串没有转换为布尔值?)【英文标题】:best_in_place gem checkbox issue with Rails 4 (why is string not converted to boolean?)Rails 4 的 best_in_place gem 复选框问题(为什么字符串没有转换为布尔值?) 【发布时间】:2014-01-31 08:13:26 【问题描述】:我的申请中有以下内容:
# some_view_file.html.haml
= best_in_place element, :inbox, :type => :checkbox
# imap_accounts_controller.rb
def update
element = ImapAccount.find(params[:id])
element.update_attributes(params[:imap_account])
respond_with element
end
但是布尔模型属性没有得到更新。也不会抛出任何错误。知道为什么我的应用程序不将 "true"
或 "false"
字符串转换为布尔值。
我已经做到了like shown in the documentation。但似乎 Rails 4 默认情况下通常不会像 like exemplified in this SO post 那样从视图/控制器接收布尔值。
服务器日志说:
Started PUT "/en/imap_accounts/525188ea83c336a4eb000002" for 127.0.0.1 at 2014-01-12 16:43:22 +0100
Processing by ImapAccountsController#update as JSON
Parameters: "imap_account"=>"enable_ssl"=>"false", "authenticity_token"=>"mX+Dpghb8nB49qhFTLbGSB2w3pJQg56PBgg8jR7G3/Y=", "locale"=>"da", "id"=>"525188ea83c336a4eb000002"
MOPED: 127.0.0.1:27017 QUERY database=myapp_development collection=users selector="$query"=>"_id"=>BSON::ObjectId('518f599683c336fb87000003'), "$orderby"=>:_id=>1 flags=[] limit=-1 skip=0 batch_size=nil fields=nil runtime: 0.8680ms
MOPED: 127.0.0.1:27017 QUERY database=myapp_development collection=imap_accounts selector="_id"=>BSON::ObjectId('525188ea83c336a4eb000002') flags=[] limit=0 skip=0 batch_size=nil fields=nil runtime: 0.4400ms
MOPED: 127.0.0.1:27017 QUERY database=myapp_development collection=imap_accounts selector="_id"=>BSON::ObjectId('525188ea83c336a4eb000002') flags=[] limit=0 skip=0 batch_size=nil fields=nil runtime: 0.6020ms
MOPED: 127.0.0.1:27017 QUERY database=myapp_development collection=users selector="$query"=>"_id"=>BSON::ObjectId('518f599683c336fb87000003'), "$orderby"=>:_id=>1 flags=[] limit=-1 skip=0 batch_size=nil fields=nil runtime: 0.3010ms
MOPED: 127.0.0.1:27017 QUERY database=myapp_development collection=imap_accounts selector="_id"=>BSON::ObjectId('525188ea83c336a4eb000002') flags=[] limit=0 skip=0 batch_size=nil fields=nil runtime: 0.5740ms
Completed 204 No Content in 182ms
【问题讨论】:
【参考方案1】:你可以通过这样做来解决你当前的问题......
# imap_accounts_controller.rb
def update
element = ImapAccount.find(params[:id])
element.update_attributes(params[:imap_account] == "true")
respond_with element
end
或者如果参数值是“1”,正如 best_in_place 文档所说,那么它会是
# imap_accounts_controller.rb
def update
element = ImapAccount.find(params[:id])
element.update_attributes(params[:imap_account] == "1")
respond_with element
end
此外,这个 gem 看起来也可以很好地解决这个问题 https://github.com/prodis/wannabe_bool
【讨论】:
以上是关于Rails 4 的 best_in_place gem 复选框问题(为啥字符串没有转换为布尔值?)的主要内容,如果未能解决你的问题,请参考以下文章
Rails 4 的 best_in_place gem 复选框问题(为啥字符串没有转换为布尔值?)
ruby on rails + best_in_place + 数据表 + haml
best_in_place 不是 Rails 3.2.1 中的函数错误
Rails - 带日期的 best_In_place gem
Rails 3.2 - best_in_place - 编辑时的日期值格式问题
使用 Rails gem 'best_in_place' 进行内联编辑 - 错误:在 textarea 上编辑后新行丢失