2017-01-05 14 views
1

Мне нужна помощь здесь. У меня есть 2 модели: - due_job и outgoing_job due_job has_many outgoing_jobs outgoing_job принадлежит_to due_job. Im пытается обновить outgoing_job пользователя, как это сделано, и в то же время создать due_job для другого пользователя. Мои модели:Как обновить модель при создании другой модели с использованием одной формы в рельсах

class DueJob < ActiveRecord::Base 

belongs_to :user 
has_many :outgoing_jobs 
accepts_nested_attributes_for :outgoing_jobs 

конец

class OutgoingJob < ActiveRecord::Base 

belongs_to :user 
belongs_to :outgoing_jobs 
accepts_nested_attributes_for :outgoing_jobs 

конец

Контроллеры:

class OutgoingJobsController < ApplicationController 

def index 
    @outgoing_job = OutgoingJob.new 
    @outgoing_jobs = OutgoingJob.all 
end 

def new 
    @outgoing_job = OutgoingJob.new 

end 

def create 
    @outgoing_job = OutgoingJob.new(outgoing_job_params) 
    respond_to do |format| 

     if @outgoing_job.save 


      flash.now[:success] = "saved" 
      format.html {redirect_to current_user} 
      format.json {render json: @outgoing_job, status: :created, location: @outgoing_job} 
     else 
      flash[:danger] = "not saved" 
      format.html {redirect_to root_path} 
      format.json {render json: @outgoing_job.errors, status: :unprocessable_entity } 
     end 
    end 
end 

def show 
@outgoing_job = OutgoingJob.find(params[:id]) 
end 

def update 
    @outgoing_job = OutgoingJob.find(params[:id]) 

respond_to do |format| 
    if @outgoing_job.update(outgoing_job_params) 
     format.html { redirect_to '/users/outgoing_job_dashboard', 
     notice: 'job updated' } 
     format.json {render action: 'show', 
      status: :ok, location: @outgoing_job } 
    else 
     format.html { render action: 'edit'} 
     format.json { render json: @outgoing_job.errors, 
      status: :unprocessable_entity} 
    end 
end 
end 

def destroy 
    @outgoing_job.destroy 
respond_to do |format| 
    format.html {redirect_to current_user} 
    format.json { head :no_content} 
end 
end 



private 
def outgoing_job_params 
    params.require(:outgoing_job).permit(:outgoing_job_value, 
     :sent, 
     :confirmed, 
     :done, 
     :due_job_id, 
     :user_id) 
end 
end 

контроллер для due_jobs, по существу, то же самое.

Однако, когда я делаю это, на мой взгляд:

<% OutgoingJob.all.each do |od| %> 
    <table class="table table-striped table-responsive"> 
    <thead> 
     <tr> 
      <th>ID</th> 
      <th>Done By</th> 
      <th>Done for</th> 
      <th>Beneficiary</th> 
      <th>Amount proposed</th> 
      <th>Amount to paid</th> 
      <th>Create due job</th> 
      <th>Actions</th> 
     </tr> 
    </thead> 



    <% if (od.confirmed == true) && (od.done== false) %> 
     <tbody> 
      <tr> 
       <td><%= od.id %></td> 
       <td><%= od.user.first_name %> <%= od.user.last_name %></td> 
       <td><%= od.due_job.user.first_name %> <%= od.due_job.user.last_name %></td> 
       <td><%= od.due_job.user.user_detail %></td> 
       <td>$ <%= number_with_delimiter(od.outgoing_job_value, delimiter: ',') %> </td> 
       <td> <%= --- %> </td> 

       <td> 
       <%= simple_form_for (DueJob.new) do |u| %> 
       <%= u.hidden_field :due_job_value, value: od.outgoing_job_value %> 
       <%= u.hidden_field :user_id, value: od.user.id %> 
       <%= u.fields_for od do |f| %> 
       <%= f.hidden_field :done, value: true %> 
       <%end%> 
       <%= u.submit "create", class: "btn btn-success" %> 

       <%end%> 
       </td> 
       <td><%= link_to "View", od %></td> 
      </tr> 
     </tbody> 


     <%end%> 
    </table> 
    ..... 

Используя вложенную форму я могу создать новый рекорд для DueJob Тхо, но он не обновлять outgoing_job. Что я пропустил?

+0

Возможно, вам повезет, если вы очистите свой код. Такие вещи: 'if (od.confirmed == true) && (od.done == false)' должно выглядеть примерно так: 'if od.confirmed? &! od.done? '. Куски типа '<%end%>' должны быть более четко написаны: '<% end %>'. И для любви ко всем святым нужно использовать последовательный отступ, чтобы мы не смотрели на суп из слова. – coreyward

+0

Спасибо @coreyward. Верно подмечено. Я сделаю все возможное. –

ответ

2

Я предлагаю вам использовать ActiveRecord callbacks, чтобы отнести часть кода к вашим моделям (я сомневаюсь, что попытка сделать все с одного взгляда - путь).

В модели для DueJob добавить что-то вроде:

class DueJob < ActiveRecord::Base 
    # Register a callback to execute every time you create a new DueJob 
    after_create :update_done_flag_on_outgoing_job 

    # ... and add some code for that callback. 
    def update_done_flag_on_outgoing_job 
    outgoing_job.update_attribute :done, true 
    end 

Просто от чтения исходного кода, я изо всех сил пытался понять, как определить связи между вновь созданной DueJob и конкретной OutgoingJob записи, которую вы хотите обновить. Как отметил @coreyward, было бы полезно, если бы вы могли представить свой код немного аккуратнее. Если вы не можете использовать мой примерный снипп как есть, я думаю, вы всегда можете приспособить метод update_done_flag_on_outgoing_job к вашим потребностям.

Упование вы считаете полезным.