2017-01-05 60 views
1

请在这里获得帮助。 我有2个模型: - due_job和outgoing_job due_job has_many outgoing_jobs outgoing_job belongs_to due_job。 我试图更新用户的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)'应该看起来更像这样:'如果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方法。

希望你觉得有帮助。

相关问题