我没有用这个Jquery-tokeninput或Rails虚拟属性做很多事情,但是用这个来抨击我的头撞墙.任何帮助或指导表示赞赏.
我的公告模型中有一个虚拟属性读取器,我需要验证以下内容:
attr_reader :classroom_tokens
validates :classroom_tokens, :presence => true``
Run Code Online (Sandbox Code Playgroud)
然后是getter和setter:
def classroom_tokens=(ids)
self.classroom_tokens = ids.split(",")
end
def classroom_tokens
#Tried several things here
end
Run Code Online (Sandbox Code Playgroud)
我真的只需要确保params [:announcement] [:classroom_tokens]不是空的.上面的验证调用似乎正在寻找其他东西,因为无论如何它总是空的.我错过了什么?任何帮助是极大的赞赏.
Rails 3.1 Ruby 1.9.2
更新: 如果我这样做
#Announcement MODEL
attr_reader :classroom_tokens
#validates :classroom_tokens, :presence => true
def classroom_tokens=(ids)
@classroom_tokens = ids.split(",")
end
#Announcement_controller create action
puts "Token=>#{@announcement.classroom_tokens}|"
puts "Params=>#{params[:announcement][:classroom_tokens]}|"
Run Code Online (Sandbox Code Playgroud)
我明白了:
Token=>|
Params=>7,13,12|
Run Code Online (Sandbox Code Playgroud) 我花了很多时间试图解决模型中的虚拟属性问题.原来我只是忘了把它添加到模型中的attr_accesible.当然,我应该早点或更好地抓住它,首先应该通过将其添加到attr_accessible来开始整个过程.
为了防止这种情况再次发生,是否有一个配置设置我可以标记为在开发时抛出异常,如果我尝试批量分配并在受保护/不可访问时验证它?我知道我可以使用set config.active_record.whitelist_attributes = true来要求所有人使用白名单,但我的问题更多的是基于个别属性.
例如,如果我有一个带有attr_accessible的模型,则上面的行不会发出警告:name然后添加:nickname(virtual或not),并尝试批量指定它检查presence => true.我希望它警告我,我试图通过质量分配来验证受保护的属性.
我有一个产品模型,我需要在_form视图中写入,管理员想要插入的产品的数量.我有另一个带有Supply(产品数量)的表,所以在我的产品表中我没有属性数量,但我只有supply_id(链接我的两个产品和供应表)
由于我的产品表中没有数量,因此我在Product上使用了虚拟属性.
我不得不改变新的视图和编辑产品的原因在新的我希望字段数量但在编辑中我不想要(因为我使用另一个视图来做这个)所以,我删除了部分_form并创建了单独的视图.另外,我必须在产品的控制器中设置如果我想更新产品,我必须调用set_quantity回调,因为我必须插入一个"假"值来填充params[:product][:quantity].这是因为我在产品模型中的数量虚拟字段上设置了验证状态为true.我想知道,如果所有这些故事都是正确的(它有效,但我想要一个关于这个故事的编程设计的建议.因为我不喜欢这样一个事实,即当我有一个假值来填充数量字段时更新产品)
控制器:
class ProductsController < ApplicationController
include SavePicture
before_action :set_product, only: [:show, :edit, :update, :destroy]
before_action :set_quantita, only: [:update]
....
def set_quantita
params[:product][:quantita]=2 #fake value for the update action
end
....
end
Run Code Online (Sandbox Code Playgroud)
模型:
class Product < ActiveRecord::Base
belongs_to :supply ,dependent: :destroy
attr_accessor :quantita
validates :quantita, presence:true
end
Run Code Online (Sandbox Code Playgroud)
如果有更好的方法来填写param[:product][:quantity]更新操作,你能说我吗?因为我不喜欢我给它的值2的事实.谢谢.
在我的假期模型Vac 中,我有这个功能
public function getVacCount(){
Run Code Online (Sandbox Code Playgroud)
此函数返回一个假期有多少天。
我想向 cgridview 添加一个自定义列,如下所示:
<?php
$this->widget('zii.widgets.grid.CGridView', array(
...
array(
'name' => 'count',
'value' => '$data->getVacPeriod()'
),
...
),
));
?>
Run Code Online (Sandbox Code Playgroud)
它工作正常。但我不知道如何对这个自定义属性进行排序。我尝试使用 CSort 但它不起作用。任何的想法?
我在表单助手中遇到了一个奇怪的错误.
我的模型看起来像这样:
class Folder < ActiveRecord::Base
...
# VIRTUAL ATTRIBUTES
def parent_name
self.parent.name
end
def parent_name=(name)
self.parent = self.class.find_by_name(name)
end
...
end
Run Code Online (Sandbox Code Playgroud)
我正在使用HAML和SimpleForm.当我像这样使用我的表格时......
= simple_form_for [@collection, form], :html => { :class => 'full' } do |f|
= f.input :name
= f.input :description
= f.submit
Run Code Online (Sandbox Code Playgroud)
......它完美无缺.但是如果我尝试像这样访问虚拟属性......
= simple_form_for [@collection, form], :html => { :class => 'full' } do |f|
= f.input :name
= f.input :parent_name
= f.input :description
= f.submit
Run Code Online (Sandbox Code Playgroud)
...我收到此错误:
NoMethodError in Folders#index
Showing ... where line #3 raised:
undefined …Run Code Online (Sandbox Code Playgroud)