Создать только дочерний элемент и выбрать родительский элемент во вложенной форме? - PullRequest
0 голосов
/ 25 марта 2012

Вместо создания нового Родителя, а также создания детей. Можно ли выбрать из списка родителей и затем создать только тех детей, которые назначены текущему пользователю и конкретному опросу?

Давайте использовать этот пример:

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 Ответ

1 голос
/ 25 марта 2012

Вы можете вызвать действие редактирования существующего опроса, передав ему выбранный опрос:

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.

Мой ответ здесь - это сводка скриншота Райана Бейтса о вложенных формах , который, я думаю, вы уже сделаливидно, исходя из сходства вашего примера и его.

Здесь я хотел бы отметить, что вы можете достичь того, чего хотите, используя точно такой же код, однако используя действия редактирования / обновления в вашей родительской модели вместо новых / создания в дочерней модели.

Редактировать:

Чтобы назначить текущего пользователя для вопроса опроса, выполните явное назначение в действии 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.

...