rails属性发生了变化,尽管没有形式

时间:2015-10-26 23:41:42

标签: ruby-on-rails forms attributes

我有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部分<%= render @tasks%>而不是去普通的旧@ tasks.each做|任务|版。我首先想到它发生的原因是因为我在新的AJAXified版本中犯了一些错误,但是在git reset --hard之后它似乎是其他的东西。

<% 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>

_task.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 %>

_form.html.erb

before_action :set_assigner, only: :create

private

def set_assigner
  @task.assigner.id = current_user.id
end

更新: 基于Rich Peck和miler350的答案解决了问题。我做了以下事情:

movies_layout

2 个答案:

答案 0 :(得分:3)

def task_params
  params.require(:task).permit(:executor_id, :name, :content, :deadline, :task_name_company).merge(assigner_id: current_user.id)
end

每次传入参数时,都会将分配器ID设置为current_user。

我会删除合并,只有像这样强大的参数:

params.require(:task).permit(:executor_id, :name, :content, :deadline, :task_name_company, :assigner_id)

然后,在您的创建操作中,在执行之前:

@task.save

添加:

@task.assigner_id = current_user.id

然后你可以定义你选择的权限(必须是分配者,必须是执行者),但只要你不添加任何疯狂的更新,它就能正常工作。

答案 1 :(得分:1)

  

默认情况下,任务创建者(current_user)始终是分配者

这应该无关紧要 - 有人是分配者,有人是执行者

miler350是正确的 - 您的参数不断设置assigner_id: current_user.id(看起来像我的建议之一)。

修复方法是从你的params&amp;中移除.merge。在控制器操作中设置它(根据miler350的回答&amp;喜欢这样):

#app/controllers/tasks_controller.rb
class TasksController < ApplicationController

    def new
        @task = Task.new
    end

    def create
        @task = Task.new task_params
        @task.assigner = current_user
        @task.save
    end

    def edit
        @task = Task.find params[:id]
    end

    def update
        @task = Task.find params[:id]
        @task.update task_params
    end

    private

    def task_params
        params.require(:task).permit(:executor_id, :name, :content, :deadline, :task_name_company, :assigner_id)
    end

end

让用户&#34;编辑&#34;一个assignment,您每次都定义了不同的assigner / executor

相关问题