通过Rails中的ajax调用和部分访问值

时间:2015-01-31 21:15:20

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

我正在寻找是否有更好的方法来迭代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时,正在遍历所有用户文档,而不是仅仅是特定技能的文档。

1 个答案:

答案 0 :(得分:0)

您的问题发生是因为您尝试使用部分shared/documents/document_form。部分期望document变量是一个数组而不是一个对象。我们可以在您的视图中看到您已使用文档列表初始化documentselect方法会根据条件返回数组。

create操作中,您已将@document初始化为Document对象,因此当您在该部分中使用@document作为document的值时,视图不会呈现您的预期结果。

创建另一个可以处理预期视图的部分,或者重构当前部分以处理document变量的不同数据类型。

编辑: 所以基本上,在document_form部分,您在局部变量each上调用document方法对吗?当您通过ajax调用partial时,您无法在each上调用current_user.documents.new(document_params),这是document变量的值。