我是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中创建的,并在数据库中正确创建。只是不是为列表中的每个用户创建权限,而是仅创建默认权限。
_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
答案 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 %>