仅创建Child并以嵌套形式选择Parent?

时间:2012-03-25 17:15:53

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 nested-forms

而不是创建新的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

我不确定创建和新动作会变成什么。有什么想法吗?

1 个答案:

答案 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。

修改

要将当前用户分配到调查问题,请在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的其他属性。