我正在寻找是否有更好的方法来迭代documents
每个skill
赢取我的应用,因为我当前的实现在使用ajax时导致了我的问题
我的模特
class Skill < ActiveRecord::Base
has_many :documents
end
class Document < ActiveRecord::Base
belongs_to :skill
belongs_to :user
end
class User < ActiveRecord::Base
has_many :documents
end
在我的观看public/index
中,我展示了我的Skills
以及用户已附加到特定documents
的每个Skill
class PublicController < ApplicationController
def index
@skills = Skill.all
@documents = current_user.documents.where(skill_id: @skills.map(&:id)).all
end
end
查看
<% @skills.group_by(&:year_group_name).each do |key, value| %>
<h3><%= key %></h3>
<% value.group_by(&:aspect_name).each do |key_one, value_one| %>
<h4><%= key_one %></h4>
<% value_one.each do |s| %>
<% document = @documents.select { |d| d.skill_id == s.id } %>
<li><%= s.skill_description %>
<%= render partial: 'shared/documents/document_form', locals: { document: document } %>
</li>
<% end %>
<% end %>
<% end %>
document_form
<% if document %>
<% document.each do |doc| %>
<%= doc %><!-- renders image if exists for user -->
<% end %>
<%= render template: '/documents/new' %>
<% else %>
<%= render template: '/documents/new' %>
<% end %>
当我创建文档时,它通过ajax完成并调用我的create.js.erb
create.js.erb
$('.doc_upload').html("<%= j render(partial: 'shared/documents/document_form', locals: { document: @documents }) %>")
在文档控制器中创建操作
def create
@document = current_user.documents.new(document_params)
respond_to do |format|
if @document.save
format.html { redirect_to root_path, notice: success_save_msg }
format.js
else
format.html
format.js { render action: 'create.js.erb' }
end
end
端
当我渲染create.js.erb
时(例如,当验证失败时)我的问题出现了
你可以看到我正在传递本地@documents
,当我调用document_form
时,正在遍历所有用户文档,而不是仅仅是特定技能的文档。
答案 0 :(得分:0)
您的问题发生是因为您尝试使用部分shared/documents/document_form
。部分期望document
变量是一个数组而不是一个对象。我们可以在您的视图中看到您已使用文档列表初始化document
,select
方法会根据条件返回数组。
在create
操作中,您已将@document
初始化为Document对象,因此当您在该部分中使用@document
作为document
的值时,视图不会呈现您的预期结果。
创建另一个可以处理预期视图的部分,或者重构当前部分以处理document
变量的不同数据类型。
编辑:
所以基本上,在document_form
部分,您在局部变量each
上调用document
方法对吗?当您通过ajax调用partial时,您无法在each
上调用current_user.documents.new(document_params)
,这是document
变量的值。