首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails fields_for非嵌套模型

Rails fields_for非嵌套模型
EN

Stack Overflow用户
提问于 2014-07-22 07:08:32
回答 1查看 242关注 0票数 1

我有一个rails应用程序,其功能如下:

代码语言:javascript
复制
class Habit < ActiveRecord::Base
  has_many :habit_journals
  has_many :road_blocks

class RoadBlock < ActiveRecord::Base
  belongs_to :habit
  has_many :road_block_histories


class HabitJournal < ActiveRecord::Base
   belongs_to :habit
   end

我有一个创建HabitJournals的表单,尽管在这个表单中我尝试创建RoadBlockHistories (这只是一个RoadBlock随时间推移的等级)。

我似乎想不出如何为这个创建表单。

习惯有很多HabitJournals和RoadBlocks。RoadBlockHistories与HabitJournals没有直接关系,但我仍然希望在提交的表单中捕获这些内容。

任何帮助都将不胜感激。

干杯M

对不起,我意识到我需要添加更多的信息。这里是Rails 4.1

用户会养成“更健康”这样的习惯。然后,他们会为这种习惯设置一些路障,比如“晚上吃巧克力”和“睡在里面而不是锻炼”。

当用户查看一个习惯时,他们可以添加一个日志条目(更新他们是如何建立该习惯的)。

当添加日记条目时,我希望用户能够显示所有的“路障”和下拉列表,以选择一个评分(这是他们如何使用该路障的10分中的一个标记)。此评级将创建一个road_block_history对象。

希望这能澄清。

干杯M

EN

回答 1

Stack Overflow用户

发布于 2014-07-22 08:00:43

对象

我明白你想要什么

您需要考虑的是Rails (特别是Ruby )的本质。Ruby是一种http://www.tutorialspoint.com/ruby/ruby_object_oriented.htm语言,意味着它所做的一切都是基于对象的。

问题在于您要创建的对象("RoadBlockHistories")与您要创建的“父”对象("HabitJournals")没有直接关联。

accepts_nested_attributes_for

克服这个问题的“方法”通常是使用accepts_nested_attributes_for方法--基本上允许您将数据从父模型传递给子模型。

这里要注意的是,只有当您的模型直接关联时,这才能工作,IE是您要创建的模型的has_manybelongs_tohas_many :through

这不是魔法-它是核心Ruby。如果您有一个您想要填充的模型,如果它有关联的数据,您将能够通过您的原始模型发送它。但是,由于语言是面向对象的,因此不能只填充不相关的对象而不具有该关联。

Fix

从您编写的内容来看,我肯定会将这两种表单视为单独的数据对象(IE不与它们关联)。

也许您可以这样做(尽管它需要调整):

代码语言:javascript
复制
#app/models/habit.rb
class Habit < ActiveRecord::Base
  has_many :habit_journals
  has_many :road_blocks
end

#app/models/road_block.rb
class RoadBlock < ActiveRecord::Base
  belongs_to :habit
  has_many :road_block_histories
end

#app/models/habit_journal.rb
class HabitJournal < ActiveRecord::Base
   belongs_to :habit
   has_many :road_blocks
end

虽然这没有经过测试,我也不认为它会起作用,但我所包含的原因是为了让您了解如何将“未关联的”对象传递到Rails。

实际上,您可以通过其他对象/数据传递对象/数据--因此您实际上可以使用以下内容:

代码语言:javascript
复制
#app/controllers/habit_journals_controller.rb
Class HabitJournalsController < ApplicationController
   def new
       @habit_journal = HabitJournal.new
       @habit_journal.road_blocks.build.road_block_histories.build #-> again, not sure if will work
   end

   def create
       @habit_journal = HabitJournal.new(habit_journal_params)
       @habit_journal.save
   end

   private

   def habit_journal_params 
       params.require(:habit_journal).permit(:x, :y, :z, road_blocks_attributes: [road_block_histories_attributes:[] ])
   end
end

如果关联是正确的,这将允许您创建以下表单:

代码语言:javascript
复制
#app/views/habit_jorunals/new.html.erb
<%= form_for @habit_journal do |f| %>
   <%= f.fields_for :road_blocks do |rb| %>
       <%= rb.fields_for :road_blocks_histories do |h| %>
           <%= h.text_field :rating %>
       <% end %>
   <% end %>
<% end %>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24880953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档