0

而不是创建一个新的父,并创建子项。是否可以从家长列表中进行选择,然后只创建分配给当前用户和特定调查的孩子?仅创建子项并选择嵌套形式的父项?

让我们用这个例子:

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 

我不知道什么是创造和新的行为会变成。任何想法?

回答

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 

所有这一切都将工作假设你已经在survey模型设定accepts_nested_attributes_for :questions

我的回答是Ryan Bates' screencast on nested forms的总结,我认为你已经看到了,基于你的例子和他的例子的相似性。

我想在这里指出的是,您可以使用完全相同的代码实现您想要的功能,但是在父模型上使用编辑/更新操作而不是在子模型上创建/创建。

编辑:

为当前用户分配到一个调查问题,请在newedit行动的明确划分:

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的其他属性。