вложенная форма с полиморфными моделями - PullRequest
4 голосов
/ 13 июля 2011

Я делаю приложение со следующими атрибутами, и я работаю над созданием единой формы, чтобы иметь возможность сохранять цель, задачи цели, вехи цели и задачи вехи.

#app/models/goal.rb
  has_many :tasks, :as => :achievement
  has_many :milestones
  accepts_nested_attributes_for :tasks
  accepts_nested_attributes_for :milestones

#app/models/milestone.rb
  belongs_to :goal
  has_many :tasks, :as => :achievement

#app/models/task.rb
  belongs_to :achievement, :polymorphic => true

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

Форма:

<%= nested_form_for @goal do |f| %>

  <%= render 'shared/error_messages', :object => f.object %>
  <%= render 'shared/goal_fields', :f => f %>

  <%= f.fields_for :milestones do |ff| %>
    <%= render 'shared/milestone_fields', :f => ff %>
  <% end %> 

  <%= f.fields_for :tasks do |ff| %>
    <%= render 'shared/task_fields', :f => ff %>
  <% end %>

  <%= f.link_to_add "Add Milestone", :milestones %>
  <%= f.link_to_add "Add Task", :tasks %>

  <%= f.submit %>

<% end %>

частичное milestone_fields:

  <%= f.label :content, "Milestone" %>
  <%= f.text_field :content %>

  <%= f.fields_for :tasks do |ff| %>
    <%= render 'shared/task_fields', :f => ff %>
  <% end %>

  <%= f.link_to_remove "Remove milestone" %>
  <%= f.link_to_add "Add Milestone Task", :tasks %>

частичное_поля полей:

  <%= f.label :content, "Task" %>
  <%= f.text_field :content %>
  <%= f.link_to_remove "Remove Task" %>

контроллер цели:

def new
  @goal = current_user.goals.new
end

def create
  @user = current_user
  @goal = @user.goals.build(params[:goal])
  if @goal.save
    flash[:success] = "Goal created!"
    redirect_to goals_path 
  else
    render 'new'
  end 
end 

Я попытался добавить @ goal.milestones.build и @ goal.tasks.build рядом с кодом f.fields_for, который, кажется, исправил его, но приводит к другим проблемам, таким как пустая форма редактирования (данные не -пополнено), а также поля вех и задач, которые отображаются сразу, вместо того, чтобы щелкнуть ссылку, чтобы открыть пустое поле. Если вы не можете решить эту проблему, есть ли сайты, где я могу заплатить другим кодировщикам за помощь в решении небольшой проблемы, подобной этой? Я в отчаянии в этот момент.

1 Ответ

2 голосов
/ 13 июля 2011

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

# app/models/milestone.rb
accepts_nested_attributes_for :tasks

Все остальное в моделях выглядит хорошо. Что касается хелпера формы fields_for, то при передаче build будет создан новый экземпляр указанного объекта, что приведет к пустой форме редактирования, которую вы описываете. Попробуйте удалить эти сборки, если nested_form_for будет обрабатывать создание и добавление этих новых полей формы.

Я воссоздал вашу среду, и когда я публикую свою форму, я получаю следующий хэш params в журнале сервера:

{"goal"=>{"milestones_attributes"=>{"0"=>{"content"=>"foo", "tasks_attributes"=>{"0"=>{"content"=>"bar"}}}}, "tasks_attributes"=>{"0"=>{"content"=>"baz"}}}}

При этом были созданы две записи задач: одна для достижения_типа 'Цель', а другая для достижения_типа 'Веха'

Что касается оплаты кого-либо за выполнение этой работы, http://www.rent -acoder.com / - это веб-сайт, на котором, как я слышал, говорят, что люди принимали работу в прошлом. Я не могу говорить за Качество кода, но вы можете опубликовать свою работу и посмотреть, какие укусы вы получаете.

...