如何在rails中使用一个表单创建另一个模型时更新模型

时间:2017-01-05 00:10:34

标签: ruby-on-rails nested-forms ruby-on-rails-4.2

请在这里需要帮助。 我有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。我错过了什么?

1 个答案:

答案 0 :(得分:3)

我建议你利用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方法。

希望您觉得有帮助。