我希望我的用户模型在保存之前清理一些输入.现在一些简单的空白剥离就可以了.因此,为了避免人们注册"哈利"并假装成"哈利",例如.
我认为在验证之前进行这种剥离是个好主意,这样validates_uniqueness_of可以避免意外的重复.
class User < ActiveRecord::Base
has_many :open_ids
validates_presence_of :name
validates_presence_of :email
validates_uniqueness_of :name
validates_uniqueness_of :email
validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
before_validation :strip_whitespace, :only => [:name, :email, :nick]
private
def strip_whitespace(value)
value.responds_to?('strip') ? value.strip : value
end
end
Run Code Online (Sandbox Code Playgroud)
但是,此代码附带错误ArgumentError:错误的参数数量(0表示1).我假设回调将传递值.
另外:这个剥离实际上是个好主意吗?或者我应该在空间上验证并告诉用户"Harry"包含无效的spacess(我想允许"Harry Potter"而不是"Harry\s\sPotter").
编辑:正如评论中所指出的,我的代码是错误的(这就是我问问题的原因).除了我的问题之外,请确保您阅读接受的答案以获取正确的代码,并避免我犯的错误.
我对MVC中"模型"的概念感到非常困惑.今天存在的大多数框架将模型放在Controller和数据库之间,而模型几乎就像数据库抽象层.随着Controller开始做越来越多的逻辑,'Fat Model Skinny Controller'的概念就丢失了.
在DDD中,还有域实体的概念,它具有唯一的身份.据我了解,用户是实体的一个很好的例子(例如,唯一的用户ID).实体有一个生命周期 - 它的值可以在整个动作过程中改变 - 然后它被保存或丢弃.
我上面描述的实体是我认为模型应该在MVC中的内容?我有多偏离基础?
为了使事情更加混乱,你会引入其他模式,例如Repository模式(可能会在其中放置一个Service).很清楚Repository如何与实体交互 - 它与模型有什么关系?
控制器可以有多个模型,这使得模型看起来像一个"数据库表"而不是一个独特的实体.
更新: 在这篇文章中,模型被描述为具有知识的东西,它可以是单数或对象的集合.所以听起来更像是一个实体,一个模型或多或少都是一样的.模型是一个包罗万象的术语,其中实体更具体.值对象也是一个模型.至少在MVC方面.也许???
所以,从非常粗略的角度来看,哪个更好?
没有"模特"真的......
class MyController {
public function index() {
$repo = new PostRepository();
$posts = $repo->findAllByDateRange('within 30 days');
foreach($posts as $post) {
echo $post->Author;
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者这个,它有一个模型作为DAO?
class MyController {
public function index() {
$model = new PostModel();
// maybe this returns a PostRepository?
$posts = $model->findAllByDateRange('within 30 days');
while($posts->getNext()) {
echo $posts->Post->Author;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这两个例子都没有做我上面描述的内容.我很丢失.有什么输入?
如果我只想在create上进行验证,那么我可以做
validates_presence_of :password, :on => :create
Run Code Online (Sandbox Code Playgroud)
但是我怎么说创建和更新?我尝试了这个,但它不起作用:
validates_presence_of :password, :on => [ :create, :update ]
Run Code Online (Sandbox Code Playgroud)
我必须定义两次验证吗?
我有以下型号:
public class FormularModel
{
[Required]
public string Position { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Required]
public string Webcode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
必需的验证工作正常.但是当我尝试使用DataType时它没有反应.
这是我的电子邮件控件的剃刀代码:
@Html.TextBoxFor
(model => model.Email,
new { @style = "width: 175px;", @class = "txtField" }
) *
Run Code Online (Sandbox Code Playgroud)
那么,有人知道答案吗?
TIA
我有以下2个型号
class Sport < ActiveRecord::Base
has_many :charts, order: "sortWeight ASC"
has_one :product, :as => :productable
accepts_nested_attributes_for :product, :allow_destroy => true
end
class Product < ActiveRecord::Base
belongs_to :category
belongs_to :productable, :polymorphic => true
end
Run Code Online (Sandbox Code Playgroud)
如果没有产品,运动就不可能存在,所以sports_controller.rb我的拥有:
def new
@sport = Sport.new
@sport.product = Product.new
...
end
Run Code Online (Sandbox Code Playgroud)
我试图将产品的创建转移到运动模型,使用after_initialize:
after_initialize :create_product
def create_product
self.product = Product.new
end
Run Code Online (Sandbox Code Playgroud)
我很快就知道after_initialize只要模型被实例化(即来自一个find调用)就会被调用.所以这不是我想要的行为.
我应该如何建模所有人sport都有的要求product?
谢谢
我需要检查是否Model.objects.filter(...)有任何东西,但不需要插入任何东西.到目前为止我的代码是:
user_pass = log_in(request.POST) # form class
if user_pass.is_valid():
cleaned_info = user_pass.cleaned_data
user_object = User.objects.filter(email = cleaned_info['username'])
Run Code Online (Sandbox Code Playgroud) 我正在尝试学习域驱动设计(DDD),我认为我有了基本的想法.但是有些让我困惑的事情.
在DDD中,持久性模型和域模型是不同的东西?我的意思是,我们设计的域名和类只考虑了域名问题; 没关系.但在那之后,当我们构建我们的存储库或任何其他数据持久性系统时,我们是否应该创建另一个模型以在持久层中使用?
我在想我们的域模型也用于持久化,这意味着我们的存储库从查询返回我们的域对象.但今天,我读了这篇文章,我有点困惑:
如果这是真的,那么从域对象中获得单独的持久性对象会有什么好处?
oop domain-driven-design model repository repository-pattern
假设在Ruby中进行以下数据库迁移:
create_table :question_votes do |t|
t.integer :user_id
t.integer :question_id
t.integer :vote
t.timestamps
end
进一步假设我希望DB中的行包含唯一(user_id,question_id)对.为了实现这一目标,在模型中投入的正确粉尘是什么?
validates_uniqueness_of :user_id, :question_id似乎只是通过用户ID使行唯一,并且通过问题ID使其唯一,而不是由对唯一.
我很难理解这个词的含义是什么:
Entity,Model,DataModel,ViewModel
任何人都可以帮我理解他们吗?谢谢你们.
Xcode 8更新:
在Xcode 8中,需要转到Core Data Model Editor和Show the File Inspector.靠近底部是代码生成的选项.选择Swift.
编辑:我找到了从Core Data实体生成Swift模型的解决方案:
在Xcode上:
编辑>创建NSManagedOjbect>单击按钮"下一步">单击"下一步"按钮>选择"Swift"Langage>单击"创建"按钮
我使用Core Data在Xcode 6 beta上创建了一个新的Swift项目,尝试了Swift语言.
当我从Core Data的实体生成模型时,Xcode创建了Objective-C模型.
有没有办法用Core Data生成Swift模型而不是Obejctive-C模型?
谢谢 !