Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中通过ajax调用和部分访问值_Ruby On Rails_Ruby_Ajax_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 在Rails中通过ajax调用和部分访问值

Ruby on rails 在Rails中通过ajax调用和部分访问值,ruby-on-rails,ruby,ajax,ruby-on-rails-4,Ruby On Rails,Ruby,Ajax,Ruby On Rails 4,我想看看是否有更好的方法来迭代每个技能的文档,赢得我的应用,因为我当前的实现在使用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

我想看看是否有更好的方法来迭代每个
技能的
文档
,赢得我的应用,因为我当前的实现在使用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
看法

在文档控制器中创建操作

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\u form
时,它将遍历所有用户文档,而不仅仅是针对特定技能的文档。

您的问题是因为您试图使用部分
共享的/documents/document\u form
。该分部要求
文档
变量是数组,而不是单个对象。我们可以在您的视图中看到,您已经使用文档列表初始化了
document
select
方法根据条件返回一个数组

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

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

编辑:
所以基本上,在
document\u表单
partial中,您正在调用局部变量
document
上的
each
方法,对吗?您不能在
当前用户.documents.new(document\u params)
上调用
每个
,这是您通过ajax调用分部时
文档
变量的值。

很抱歉,但是您可以重新表述您的问题吗。似乎你在一个线程下有太多的问题,我对你的
真正的
问题有点困惑。@发现我已经重新构造了我的问题,希望这现在更有意义,谢谢你也许我没有正确理解你的代码,但我没有找到你在#create action中定义\@documents变量的地方。只有\@文档。也许有任何before_操作可以获取所有用户的文档?此外,您可以在索引操作中重写查询,如下所示:current_user.documents.where('skill_id is not?',nil)@hedgesky抱歉,您是对的,我确实有一个before_操作,可以获取创建操作中调用的所有用户文档,我已经删除了它,所以现在@documents只在
public/index
中声明。。我试图实现的是只显示属于该特定技能的用户的文档。这有意义吗?谢谢你的回答,你能举个例子说明我如何处理这个问题吗?我不太清楚你的意思或者更好,但是你能看看吗,因为我做了一些重构。我提供了额外的信息,希望你这次能得到。谢谢你提供的额外信息,但事实证明与此无关。。你介意删除答案吗?我会删除这个问题,因为这对将来的任何人都没有帮助,谢谢你的帮助,谢谢
<% @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 %>
<% if document %>
  <% document.each do |doc| %>
    <%= doc %><!-- renders image if exists for user -->
  <% end %>            
  <%= render template: '/documents/new' %>
<% else %>
  <%= render template: '/documents/new' %>
<% end %>
$('.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