我有一个rails应用程序,其功能如下:
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
发布于 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_many、belongs_to或has_many :through。
这不是魔法-它是核心Ruby。如果您有一个您想要填充的模型,如果它有关联的数据,您将能够通过您的原始模型发送它。但是,由于语言是面向对象的,因此不能只填充不相关的对象而不具有该关联。
Fix
从您编写的内容来看,我肯定会将这两种表单视为单独的数据对象(IE不与它们关联)。
也许您可以这样做(尽管它需要调整):
#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。
实际上,您可以通过其他对象/数据传递对象/数据--因此您实际上可以使用以下内容:
#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如果关联是正确的,这将允许您创建以下表单:
#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 %>https://stackoverflow.com/questions/24880953
复制相似问题