Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 视图/控制器中的关系问题_Ruby On Rails_Activerecord_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 视图/控制器中的关系问题

Ruby on rails 视图/控制器中的关系问题,ruby-on-rails,activerecord,ruby-on-rails-3,Ruby On Rails,Activerecord,Ruby On Rails 3,我有两个类似的模型(简化): 食谱(有一个视频) 身份证 名字 描述 视频(属于配方) 身份证 链接 配方id 在RecipesController#new中,我呈现了一个用于创建资源的视图。 我对@recipe使用form_,与所有常规的f助手一起使用 问题是我需要一个字段来填充link属性,它属于不同的对象(视频)。因此,由于f.helpers在所有内容前面加上resource[field],所以我使用了一个常规的text\u field\u标记:link 到目前为止一切都很顺利。在

我有两个类似的模型(简化):

食谱(有一个视频)

  • 身份证
  • 名字
  • 描述
视频(属于配方)

  • 身份证
  • 链接
  • 配方id
在RecipesController#new中,我呈现了一个用于创建资源的视图。 我对@recipe使用form_,与所有常规的f助手一起使用

问题是我需要一个字段来填充link属性,它属于不同的对象(视频)。因此,由于f.helpers在所有内容前面加上resource[field],所以我使用了一个常规的text\u field\u标记:link

到目前为止一切都很顺利。在RecipesController#create I do中:

@recipe=recipe.new(参数[:recipe])
@recipe.video=video.new(参数[:link])

为配方分配视频

在这之后,我做了通常的@recipe.save,这就是我被卡住的地方

我希望,如果视频包含任何错误,配方将不会保存,并且我将能够使用@recipe.errors对象获取所有错误(视频中的错误也是)

但不仅配方保存,@recipe.errors不包含来自视频的消息。 我使用了一个(部分“错误”,:object=>@recipe)来列出所有消息,但这不会拾取被视频对象触发的消息

我尝试了各种方法,例如,在分部中,我有一个最初选中的条件:

if object.errors.any?
 object.errors.full_messages ...
end
我把它换成:

如果(object.errors.merge!(object.video.errors)),有吗? 但不幸的是,它没有起作用


在这种情况下我该怎么办?当视频出现错误时,如何防止@recipe保存,以及如何将它们无缝地列在一起?

处理嵌套对象需要一点工作,但并不难。自Rails2.3以来,就有了“嵌套属性”和“嵌套对象形式”的概念(请参见:和)

基本上,这允许您执行以下操作:

<% form_for @recipe do |f| %>
  <%= f.text_field :name %>
  <%= f.text_field :description %>
  <% f.fields_for :video do |v| %>
    <%= v.text_field :link %>
  <% end %>
<% end %>
。它将创建配方和视频记录,因为表单具有视频信息,并且配方类接受\u嵌套的\u属性\u for:video

--

只是想澄清一些关于代码的事情。您正在将参数[:link]传递到Video.new。Video.new不需要字符串,它需要属性的散列。那么,你打电话给

Video.new("example.com/video_file.mp4")
。当你真的想进来的时候

Video.new(:link => "example.com/video_file.mp4")
如果不是散列,ActiveRecord不知道您试图通过“new”设置哪个属性。你也可以做

v = Video.new
v.link = params[:link]
。并以这种方式设置属性。另外,根据控制器中的其他内容,您可能没有为视频分配配方id,也可能没有呼叫@video.save。有时候,ActiveRecord的酷性会让人觉得这些事情不必发生——如果你使用的是accepts_nested_attributes_之类的东西,你就不需要做这些事情了。但是,如果要手动执行此操作,则必须确保全部保存、分配关联、检查两个对象是否存在错误以及管理事务

--

关于这一点的Rails文档并不糟糕,它涉及了很多内容:


Ryan Daigle也有一篇关于它的博客文章:

处理嵌套对象需要一点工作,但并不难。自Rails2.3以来,就有了“嵌套属性”和“嵌套对象形式”的概念(请参见:和)

基本上,这允许您执行以下操作:

<% form_for @recipe do |f| %>
  <%= f.text_field :name %>
  <%= f.text_field :description %>
  <% f.fields_for :video do |v| %>
    <%= v.text_field :link %>
  <% end %>
<% end %>
。它将创建配方和视频记录,因为表单具有视频信息,并且配方类接受\u嵌套的\u属性\u for:video

--

只是想澄清一些关于代码的事情。您正在将参数[:link]传递到Video.new。Video.new不需要字符串,它需要属性的散列。那么,你打电话给

Video.new("example.com/video_file.mp4")
。当你真的想进来的时候

Video.new(:link => "example.com/video_file.mp4")
如果不是散列,ActiveRecord不知道您试图通过“new”设置哪个属性。你也可以做

v = Video.new
v.link = params[:link]
。并以这种方式设置属性。另外,根据控制器中的其他内容,您可能没有为视频分配配方id,也可能没有呼叫@video.save。有时候,ActiveRecord的酷性会让人觉得这些事情不必发生——如果你使用的是accepts_nested_attributes_之类的东西,你就不需要做这些事情了。但是,如果要手动执行此操作,则必须确保全部保存、分配关联、检查两个对象是否存在错误以及管理事务

--

关于这一点的Rails文档并不糟糕,它涉及了很多内容:


Ryan Daigle也有一篇很好的博文:谢谢!我不知道嵌套对象形式。这将非常方便,因为我肯定会经常遇到这个问题。实际上,我遇到了一个小问题,我不太确定在控制器中要做什么,目前它看起来是这样的:RecipesController#new:@recipe=recipe.new,RecipesController#create:@recipe=recipe.new(参数[:recipe])。。。如果@recipe.save。。。但它不会在视图中显示嵌套表单。我在#new部分添加了:@recipe.video=video.new,并显示了它,但当我提交表单时,我没有返回视频字段:/Oops,这是因为在配方模型中,我没有将:video_属性添加到attr_accessible。现在一切正常。再次感谢!!谢谢我不知道嵌套对象形式。这将非常方便,因为我肯定会经常遇到这个问题。实际上,我遇到了一个小问题,我不太确定在控制器中要做什么,目前它看起来是这样的:RecipesController#new:@recipe=recipe.new,RecipesController#create:@recipe=recipe.new(参数[:recipe])。。。如果@recipe.save。。。但它不会在视图中显示嵌套表单。我在#新的部分中添加了:@recipe.v