而不是创建新的Parent并创建子项。是否可以从父母列表中进行选择,然后仅创建分配给当前用户和特定调查的子项?
让我们使用这个例子:
class Survey < ActiveRecord::Base
has_many :questions
accepts_nested_attributes_for :questions
end
class Question < ActiveRecord::Base
belongs_to :survey
belongs_to :user
end
然后在控制器中:
def new
# @survey = select menu of all Surveys
3.times do
question = @survey.questions.build
end
end
def create
# Saves new questions with current user
if @survey.save
flash[:notice] = "Success"
redirect_to @survey
else
render :action => 'new'
end
end
我不确定创建和新动作会变成什么。有什么想法吗?
答案 0 :(得分:1)
您可以调用现有调查的编辑操作,将所选调查传递给它:
edit_survey_path(@survey)
然后您可以在该操作中加载选定的调查:
def edit
@survey = Survey.find(params[:id])
end
在edit
视图中,使用嵌套表单添加/删除问题,然后在update
操作中,更新调查属性也会添加和删除问题。
def update
@survey = Survey.find(params[:id])
@survey.update_attributes(params[:survey])
redirect_to ...
end
假设您在accepts_nested_attributes_for :questions
模型中设置survey
,所有这一切都会有效。
我的答案是Ryan Bates' screencast on nested forms的摘要,我认为你已经看过了,根据你的例子与他的相似之处。
我想在此指出的是,您可以使用完全相同的代码实现您想要的功能,但是使用父模型上的编辑/更新操作而不是子模型上的new / create。
修改强>
要将当前用户分配到调查问题,请在new
和edit
操作中执行明确分配:
def new
@survey = Survey.new
3.times do
question = @survey.questions.build(:user_id => current_user.id)
end
end
def edit
# find the preselected Survey...
@survey = Survey.find(params[:id])
# This adds a (one) new empty question, consider doing it via Javascript
# for adding multiple questions.
@survey.questions.build(:user_id => current_user.id)
end
在questions
的表单中,添加:
<%= form_builder.hidden_field :user_id %>
不要忘记将form_builder
替换为您的实际表单构建器对象。
现在所有新问题都将分配给当前用户,因为表单提交了当前用户以及questions
的其他属性。