如何在 rails 中使用一种形式在创建另一个模型的同时更新模型
How to Update a model while creating another model using one form in rails
请问我需要帮助。
我有 2 个模型:- due_job 和 outgoing_job
due_job has_many outgoing_jobs
outgoing_jobbelongs_todue_job。
我正在尝试更新用户的 outgoing_job,同时为另一个用户创建 due_job。
我的模特:
class DueJob < ActiveRecord::Base
belongs_to :user
has_many :outgoing_jobs
accepts_nested_attributes_for :outgoing_jobs
end
class OutgoingJob < ActiveRecord::Base
belongs_to :user
belongs_to :outgoing_jobs
accepts_nested_attributes_for :outgoing_jobs
end
控制器:
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。请问我错过了什么?
我建议您使用 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
方法。
希望对您有所帮助。
请问我需要帮助。 我有 2 个模型:- due_job 和 outgoing_job due_job has_many outgoing_jobs outgoing_jobbelongs_todue_job。 我正在尝试更新用户的 outgoing_job,同时为另一个用户创建 due_job。 我的模特:
class DueJob < ActiveRecord::Base
belongs_to :user
has_many :outgoing_jobs
accepts_nested_attributes_for :outgoing_jobs
end
class OutgoingJob < ActiveRecord::Base
belongs_to :user
belongs_to :outgoing_jobs
accepts_nested_attributes_for :outgoing_jobs
end
控制器:
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。请问我错过了什么?
我建议您使用 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
方法。
希望对您有所帮助。