Связи форм: Проблемы с сохранением информации на контроллере одновременно для двух моделей - PullRequest
0 голосов
/ 02 января 2019

Для моего проекта я пытаюсь создать панель мониторинга, с помощью которой агент может просматривать записи, опубликованные пользователем, и добавлять статус и примечания к каждой заявке, чтобы регистрировать свою личную активность, т.е. они не будут изменять фактическую запись,просто оставив личные заметки против него.Для этого я создал таблицу соединения с идентификатором агента и идентификатором отправки, а также столбцами «Состояние» и «Примечания».

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

Форма в представлении индекса

  <%= form_with(model: submission, local: true) do |form| %>
      <% form.fields_for :agent_activities do |act| %>

      <td> <div class="field">

        <%= act.text_field :Status %>

      </div>
    </td>

    <td> <div class="field">

      <%= act.text_field :Notes %>
    </div>
  </td>
  <td>
    <div class="actions">
    <%= form.submit %>
  </div>
</td>

    <% end %>
  <% end %>

Связи моделей в файлах rb

class Submission < ApplicationRecord
  belongs_to :user, :optional => true

  belongs_to :location, :optional => true

  has_many :agent_activities

end


class AgentActivity < ApplicationRecord

  belongs_to :submission, :optional => true #has submission_id 
  foreign key in table

  belongs_to :agent, :optional => true #has agent_id foreign key in 
  table


end

Контроллер:

 class SubmissionsController < ApplicationController
 before_action :set_submission, only: [:show, :edit, :update, :destroy]

def index
@submissions = Submission.where(:user_id => current_user.id)

end


def show
end


def new
@submission = Submission.new
end


def edit
end

# POST /submissions
# POST /submissions.json
def create
@submission = Submission.new(submission_params.merge(user_id: current_user.id))

respond_to do |format|
  if @submission.save
    # Tell the UserMailer to send a welcome email after save
    NewSubmissionMailer.submission_email(@submission).deliver_now
    NewSubmissionMailer.matching_agents_email(@submission).deliver_now

    format.html { redirect_to @submission, notice: 'Submission was successfully created.' }
    format.json { render :show, status: :created, location: @submission }
  else
    format.html { render :new }
    format.json { render json: @submission.errors, status: :unprocessable_entity }
  end
  end
 end

 # PATCH/PUT /submissions/1
 # PATCH/PUT /submissions/1.json
  def update
  respond_to do |format|
  if @submission.update(submission_params)
    format.html { redirect_to @submission, notice: 'Submission was successfully updated.' }
    format.json { render :show, status: :ok, location: @submission }
  else
    format.html { render :edit }
    format.json { render json: @submission.errors, status: :unprocessable_entity }
   end
  end

 end

# DELETE /submissions/1
# DELETE /submissions/1.json
def destroy
@submission.destroy
respond_to do |format|
  format.html { redirect_to submissions_url, notice: 'Submission was successfully destroyed.' }
  format.json { head :no_content }
  end
end

 private
  # Use callbacks to share common setup or constraints between actions.
  def set_submission
  @submission = Submission.find(params[:id])
  end

# Never trust parameters from the scary internet, only allow the white list through.
def submission_params
  params.require(:submission).permit(:First_Name, :Last_Name, :Phone, :Email, :Desired_Location, :number_of_beds, :number_of_occupants, :Rent_price_per_month_gbp, :Max_move_in_date, :Tenant_Occupation, :Contact_me_on, :Furnished, :Current_Address, :Property_Requirements)
end
end

Не уверен, что мне здесь не хватает: /

ОБНОВЛЕНИЕ НА ОСНОВЕ @TOMОТВЕТ

Новые параметры контроллера:

  def submission_params
  params.require(:submission).permit(:First_Name, :Last_Name, :Phone, :Email, :Desired_Location, :number_of_beds, :number_of_occupants, :Rent_price_per_month_gbp, :Max_move_in_date, :Tenant_Occupation, :Contact_me_on, :Furnished, :Current_Address, :Property_Requirements, agent_activities_attributes: [:id, :Status, :Notes, :_destroy])
end

end

Новая модель представления rb:

class Submission < ApplicationRecord
 belongs_to :user, :optional => true

 belongs_to :location, :optional => true

 has_many :agent_activities

 accepts_nested_attributes_for :agent_activities

end

Index.html.erb

  <%= form_with(model: submission, local: true) do |form| %>
  <% form.fields_for :agent_activities, @submission.agent_activities.build do |act| %>
      <td> <div class="field">

        <%= act.text_field :Status %>

      </div>
    </td>

    <td> <div class="field">

      <%= act.text_field :Notes %>
    </div>
  </td>
  <td>
    <div class="actions">
    <%= form.submit %>
  </div>
</td>

    <% end %>

1 Ответ

0 голосов
/ 02 января 2019
  1. На вашей Submission модели добавьте: accepts_nested_attributes_for :agent_activities ( acceptpts_nested_attributes_for документация ) Это позволит Rails знать, что ваша форма будет предоставлять поля для связанной модели.

  2. Как только это будет добавлено, Rails предоставит ключ в параметрах agent_activities_attributes в ваши сильные параметры, которые мы можем добавить: .permit(..., agent_activities_attributes: [:id, :Status, :Notes, :_destroy]. Клавиша :_destroy необходима только в том случае, если вы планируете использовать allow_destroy: true для вызова вложенного атрибута.

Примечание с одной стороны: заглавные имена (Status, Notes и т. Д.) Обычно зарезервированы для констант в Ruby. Возможно, вы захотите изменить имена столбцов атрибутов на строчные.

...