Rails 4 - 嵌套属性仅形成POST一个字段

时间:2015-11-03 17:28:03

标签: ruby-on-rails ruby forms ruby-on-rails-4

我是Ruby on Rails的新手,我正在创建一个用户加入房屋的系统,然后可以将笔记留给他们家中的其他用户。每个笔记应该在其家中为每个其他用户提供单独的权限。当用户创建一个笔记时,他们会看到一个表单,其中包含Note内容的文本区域,然后是房子中所有其他用户的列表,下拉列表指示用户对该笔记的权限级别。 / p>

我正在尝试使用Partials来使事情变得更好,因为Permissions是一个多态类,将在我们网站的其他部分使用。现在,当一个Note作为一个新笔记提交时,只有一个Permission被POST,而不是每个用户的Permission,例如。

Started POST "/notes" for 127.0.0.1 at 2015-11-03 11:37:47 -0500
Processing by NotesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"8+fSG6oBsp4C3ikKc6mSNQYIB+mM5w3+42Y5tRVi5LOZY4a1lo0EApLo0WtSVNZ6/MO0yRwGitZzgZWaYR23mg==", "note"=>{"content"=>"okay...", "permissions_attributes"=>{"0"=>{"user_id"=>"0", "level"=>"3"}}}, "commit"=>"Post"}

我花了一段时间将我的View代码与其他人的部分代码进行比较,并且无法弄清楚为什么它没有为每个用户提交权限。有什么建议?我可以确认提交的权限是在NoteController中创建的,并在数据库中正确创建。只是不是为列表中的每个用户创建权限,而是仅创建默认权限。

Note Creation GUI

_form.html.erb

<%= form_for(@note) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_area :content, placeholder: "Compose new Note..." %>
  </div>
  <%= f.fields_for :permissions do |perm| %>
    <%= render 'permission_new', :f => perm %>
  <% end %>

  <%= f.submit "Post", class: "btn btn-primary" %>
<% end %>

_permission_new.html.erb

<% House.find(current_user.relationship.house_id).users.each do |user| %>
  <%= render 'permission', :f => f, user: user %>
<% end %>
<% User.new(id: 0) do |user| %>
  <%= render 'permission', :f => f, user: user %>
<% end %>

_permission.html.erb

<% if current_user.id != user.id %>
<div class="permission">
  <% if user.id == 0 %>
  Default Permission
  <% else %>
<%= user.name %>
<% end %>
<%= f.hidden_field :user_id, value: user.id %><br />
<%= f.select :level, [["Read Only", 3], ["Read, Edit, and Delete", 1],
  ["Read and Edit", 2], ["Can't Read", 4]] %>
</div>
<% end %>

note_controller.rb

...
 def new
    @note = Note.new
    @note.permissions.build
  end

  def create
    @note = current_user.notes.build(note_params)
    if @note.save
      @perm_user = @note.permissions.create(user_id: current_user.id, level: 0)
      flash[:success] = "Note Created"
      redirect_to notes_path
    else
      render 'new'
     end
  end
...
  private

def note_params
  params.require(:note).permit(:content, permissions_attributes: [:user_id, :level])
end

1 个答案:

答案 0 :(得分:0)

如果有人碰巧遇到同样的问题,我想出来了。

<%= f.fields_for :permissions do |perm| %>
    <%= render 'permission_new', :f => perm %>
<% end %>

f.fields_for仅在技术上为每次调用创建一个字段。这意味着在我的_permission_new.html.erb文件中,我有一个循环为房子中的每个用户创建一个下拉列表,以及默认的下拉列表,所有这些下拉列表都链接到同一个字段,并相互覆盖。这就是为什么在提交新笔记时仅发布最后一个权限的原因。要解决此问题,您必须在表单中多次调用f.fields_for。在我的情况下,我将我的f.fields_for移动到我的_permission_new部分,最后得到了这样的代码。

_form.html.erb
...
<%= render 'permission_new', f: f %>
...

_permission_new.html.erb
<% House.find(current_user.relationship.house_id).users.each do |user| %>
  <%= f.fields_for :permissions do |perm| %>
    <%= render 'permission', :f => perm, user: user %>
  <% end %>
<% end %>
<% User.new(id: 0) do |user| %>
  <%= f.fields_for :permissions do |perm| %>
    <%= render 'permission', :f => perm, user: user %>
    <% end %>
<% end %>