小编Pha*_*ale的帖子

ActiveRecord查询中"includes"和"preload"之间有什么区别?

我很难找到ActiveRecord对象的includes()和preload()的比较.有人可以解释这个区别吗?

ruby activerecord ruby-on-rails

35
推荐指数
2
解决办法
9193
查看次数

如何根据父对象的状态验证嵌套模型对象?

我在铁轨上写了一个向导表格; 例如,一个模型对象的多个输入页面.

我的方法的基础是Ryan Bates的Multistep形式railscast中描述的那些:http: //railscasts.com/episodes/217-multistep-forms (如果有人想知道下面某些代码背后的原因).

这里审查的对象是"参与者",其中有一个"地址"

我的问题是,我只想在用户尝试通过地址输入屏幕时验证嵌套对象(地址).目前通过名为"current_step"的Participant模型上的属性来跟踪

所以我有一个参与者:

class Participant < ActiveRecord::Base
  has_one :address
  accepts_nested_attributes_for :address
  validates_presence_of :first_name, :last_name, :if => self.current_step == "name"
  ...
  def steps = %w[ name address confirm ] # the steps the wizard will follow
end
Run Code Online (Sandbox Code Playgroud)

和地址:

class Address < ActiveRecord::Base
  belongs_to :participant
  validates_presence_of :address1, :state, :suburb, :postcode #, :if => participant.current_step == "address"
end
Run Code Online (Sandbox Code Playgroud)

这种方法的原理是在向导的每个步骤中在控制器(未示出)上调用"创建"动作,并且它仅在处理每个步骤时验证模型的子集.

目前,当我完成第一个屏幕("名称")并尝试进入地址步骤时,地址验证将被触发,我将被发送回"名称"屏幕,其中包含空白地址详细信息的验证错误.

所以我在这里尝试了很多方法,其中最后一部分是上面显示的地址验证的注释条件 - 我发现这不起作用,因为我只构建参与者 - >地址对象,但不保存他们.因此@participant.address获取地址对象,但是@participant.address.participant为null,因为地址还没有一个participant_id外键来查找它的父级.

我挣扎的原因似乎是包含了超级方便的accepts_nested_attributes_for方法.我期望使用a validates_associated来进行验证,但我发现accepts_nested_attributes_for标签既可以很好地传播表单参数来创建嵌套模型对象,但也可以确保 …

ruby validation activerecord ruby-on-rails ruby-on-rails-3

22
推荐指数
1
解决办法
5966
查看次数

从rubygems.org关闭时,我在哪里可以安装gem?

目前Rubygems.org已关闭 - 网站报告错误,一些gem安装任务返回500错误.

是否存在gem文件的镜像/备份源,或rubygems.org本质上是ruby gem安装过程中的单点故障?

ruby gem

21
推荐指数
1
解决办法
7295
查看次数

如何在资源模型名称与路径或控制器不匹配时编写路由

我有一个名为的模型ImplicitTest.它被称为有一个Ruby对象,Test只是在Rails中打破了很多东西.

但是,我仍然希望将其作为RESTful资源公开test(例如/tests,/test/1/edit依此类推).此外,保持控制器的效果会很好TestsController,尽管不那么重要.

我通过resources :tests在routes.rb文件中使用简单的行来实现这一点,但这对于RESTful表单来说是失败的(例如<%= form_for @test ... >- 这会发现@test对象的类型为ImplciitTest,并尝试查找implicit_test_path不存在的行.

我尝试添加form_for选项,但得出的结论是,为了使表单适用于两者newedit操作,没有一种单一,统一的方式要求form_for()使用不同的前缀进行路径名查找.

所以我一直试图从路由方面解决问题.有没有我可以添加到路径文件的行,这将允许我:

  1. 有一个名为ImplicitTest的模型
  2. 将路径作为/ test
  3. 仍然使用<%= form_for @test ...%>标记
  4. 将控制器保持为TestsController(可选)

我知道我正在离开Golden Path来做这件事,但Rails并没有让我使用Test作为模型名称,但这是用户希望在此资源的URL中看到的名称,所以我希望有是启用此功能的简单路由选项.

rest routing ruby-on-rails rails-routing

10
推荐指数
1
解决办法
4146
查看次数

Gstatus改变了vim-fugitive的行为

几个月以来,我一直在使用vim和优秀的逃犯插件.但是今天,由于我无法解决的原因,该:Gstatus命令改变了行为.

它仍然打开一个"git status"式屏幕,它会响应"R"来刷新它.但是,当我进入"修改:..."列表并点击"D"时,而不是让两个分割窗口显示差异,我只是得到"git diff"输出.此外,在修改后的文件上点击" - "根本不会显示它.

这就像所有的力量都从这种模式消失了?

我还怀疑它所打开的"git status"屏幕实际上是git status的确切输出.它也有不同的格式; 顶行为绿色,下一行用红色背景加粗 - 这与git commit消息相同(如果不将第二行留空则突出显示错误).不确定这是否有助于或只是混淆问题...

根据下面的评论,我检查了该屏幕上的键映射:

:verbose nmap D
> n  D           *@:<C-U>execute <SNR>72_StageDiff('Gvdiff')<CR>                                                                                                                                                       
> Last set from ~/.dotfiles/vim/bundle/vim-fugitive/plugin/fugitive.vim 

:verbose nmap -
> n  -           *@:<C-U>silent execute <SNR>72_StageToggle(line('.'),line('.')+v:count1-1)<CR>                                                                                                                        
> Last set from ~/.dotfiles/vim/bundle/vim-fugitive/plugin/fugitive.vim
Run Code Online (Sandbox Code Playgroud)

任何人都知道我正在制作什么错误,或者我正在获得的其他状态屏幕是什么?

git vim vim-fugitive

5
推荐指数
1
解决办法
1572
查看次数