【发布时间】:2015-10-26 23:41:42
【问题描述】:
我有 Rails 应用程序,用户可以在其中相互分配任务。每个任务都有一个分配者和一个执行者。默认情况下,任务创建者(current_user)始终是分配者。分配者和执行者都可以编辑同一个任务。
我的问题如下。假设 user.id=2 是分配者,而 user.id=1 是执行者。如果分配者(id = 2)稍后编辑任务一切正常,但如果执行者(id = 1)编辑它,那么他也成为分配者,所以task.executor_id = 1和task.assigner_id = 1。无法更改新/编辑表单中的分配者。当分配者创建它时,他是当前用户的默认分配者,当 sby 尝试编辑它时,他/她不能更改分配者。是什么导致了这个问题?
这很奇怪,因为它之前运行良好,我有点确定我一直在遇到这个问题,因为我已经改为使用带有 的 _task.html.erb 部分而不是 w / 普通的 @tasks.each 做 |task|版本。我最初认为这是因为我在使用新的 AJAXified 版本时犯了一些错误,但在 git reset --hard 之后,它似乎是别的东西。
def task_params
params.require(:task).permit(:executor_id, :name, :content, :deadline, :task_name_company)
.merge(assigner_id: current_user.id)
end
class Task < ActiveRecord::Base
belongs_to :assigner, class_name: "User"
belongs_to :executor, class_name: "User"
_task.html.erb
<% if current_user.id == task.assigner.id %>
<tr style="background: #eaeaea" id="task_<%= task.id %>">
<td class="col-md-3">
<%= link_to user_path(id: task.executor.id) do %>
<%= task.executor.profile.first_name %> <%= task.executor.profile.last_name%> / <%= task.executor.profile.company %>
<% end %>
</td>
<% else %>
<tr id="task_<%= task.id %>">
<td class = "col-md-3">
<%= link_to user_path(id: task.assigner.id) do %>
<%= task.assigner.profile.first_name %> <%= task.assigner.profile.last_name%> / <%= task.assigner.profile.company %>
<% end %>
</td>
<% end %>
<td class="cold-md-4">
<%= link_to user_task_path(id: task.id) do %>
<%= task.content %>
<% end %>
</td>
<td class="col-md-3">
<%= task.deadline %>
</td>
<td class="col-md-2" style="padding:0px">
<% if current_user.id == task.assigner.id %>
<table class="table table-bordered inside-table" style="background:#eaeaea">
<% else %>
<table class="table table-bordered inside-table">
<% end %>
<tr>
<td class="col-md-4" style="border-top:0px;border-bottom:0px;border-left:0px">
<% if task.completed_at == nil %>
<%= link_to complete_user_task_path(id: task.id), action: :complete, remote: true, method: :patch do %>
<i class="fa fa-check"></i>
<% end %>
<% else %>
<%= link_to uncomplete_user_task_path(id: task.id), action: :uncomplete, remote: true, method: :patch do %>
<i class="fa fa-check"></i>
<% end %>
<% end %>
</td>
<td class="col-md-4" style="border-top:0px;border-bottom:0px;">
<%= link_to edit_user_task_path(id: task.id), type: "button" do %>
<i class="fa fa-pencil"></i>
<% end %>
</td>
<td class="col-md-4" style="border-top:0px;border-bottom:0px;border-right:0px">
<%= link_to user_task_path(id: task.id), method: :delete, data: { confirm: "Are you sure?" }, remote: true do %>
<i class="fa fa-trash"></i>
<% end %>
</td>
</tr>
</table>
</td>
</tr>
_form.html.erb
<%= form_for ([@user, @task]) do |f| %>
<%= render 'layouts/error_messages', object: f.object %>
<div class="field form-group">
<%= f.label :Name_or_Company %>
<%= f.text_field :task_name_company, data: {autocomplete_source: user_tasknamecompanies_path}, class: "form-control task_name_company" %>
</div>
<div class="field form-group">
<%= f.label :content %>
<%= f.text_area :content, class: "form-control" %>
</div>
<div class="field form-group">
<%= f.label :deadline %>
<%= f.date_select :deadline, class: "form-control" %>
</div>
<div class="actions">
<%= f.submit "Create Task", class: 'btn btn-primary', "data-sid" => current_user.id, "data-rip" => :executor_id %>
</div>
<% end %>
更新: 根据 Rich Peck 和 miler350 的回答解决了问题。我做了以下事情:
before_action :set_assigner, only: :create
private
def set_assigner
@task.assigner.id = current_user.id
end
【问题讨论】:
标签: ruby-on-rails forms attributes