无法添加从has_many:through表创建的视图。

时间:2014-08-15 07:49:11

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

希望我能在这里获得所有术语 - 如果不是请原谅,还是非常新的。

我正在开设一个课程项目@Bloc,并且在我的索引视图中为其他控制器添加协作者列表时遇到了问题。

我想要达到的目标是: 显示所有用户wiki - 工作。 显示用户被列为协作者的所有wiki(通过连接表创建的链接和通过引用创建的has_many。)

我的索引视图如下:(/ wikis / index)

<h1>My Wikis</h1>
 <% if policy(Wiki.new).create? %>
<%= link_to "New Wiki", new_wiki_path, class: 'btn btn-success' %>
<% end %>
<% @wikis.each do |wikis| %>
<div class="media">
 <div class="media-body">
   <h4 class="media-heading">
     <%= link_to wikis.title, wikis %>
   </h4>
  <small>
     Created <%= time_ago_in_words(wikis.created_at) %> ago by <%= wikis.user.name %><br/>
  </small>
 </div>
</div>

<% end %>

<h1>My Collaborations</h1>

<% @collaborations.each do |collaborations| %>
   <div class="media">
    <div class="media-body">
      <h4 class="media-heading">
        <%= link_to collaborations.title, collaborations %>
      </h4>

     </div>
   </div>

<% end %>


<%= will_paginate @wikis %>

我的Wiki控制器如下所示:(缩写)

class WikisController < ApplicationController
  respond_to :html, :js

  def index
    # @user = current_user

    @wikis = current_user.wikis.paginate(page: params[:page], per_page: 10)
    #@collaboration = @wiki.collaboration.build(collaboration_params)
    @collaborations = @collaboration.where(:user_id == current_user)
    authorize @wikis
  end

  def show
    @wikis = Wiki.friendly.find(params[:id])
    if request.path != wiki_path(@wikis)
      redirect_to @wikis, status: :moved_permanently
      authorize @wikis
    end
  end
end

  private
  def collaboration_params
    params.require(:collaboration).permit(:user_id, :wiki_id)
  end

end

从Rails控制台 - 我可以看到我的协作关系正在按预期工作 - 我只是无法弄清楚我应该使用什么语法来使其在我的索引视图上呈现。

2.0.0-p481 :022 > Collaboration.last
  Collaboration Load (1.9ms)  SELECT  "collaborations".* FROM "collaborations"   ORDER BY    "collaborations"."id" DESC LIMIT 1
log writing failed. Protocol error - /home/vagrant/code/blocipedia/log/development.log
 => #<Collaboration id: 3, user_id: 1, wiki_id: 16>
2.0.0-p481 :023 >

任何指针都将非常感激。我已经尝试了100种不同的组合来解决这个问题。

现在我在索引视图上触发的错误是:

undefined method `where' for nil:NilClass

干杯 凯文。

1 个答案:

答案 0 :(得分:0)

<强>对象

您遇到的简单错误是:

@collaborations = @collaboration.where(:user_id == current_user)

此处的错误是您在尚未填充(已定义)的变量上调用.where

Ruby / Rails与其他语言的工作方式略有不同,因为它是object orientated。这意味着每次Rails调用&#34;对象&#34;时,它实际上将定义,而不是填充

根据经验,no method error通常(尽管不总是)是系统未正确填充变量的结果。


<强>模型

解决这个问题的方法非常简单 -

您需要能够在调用@collaboration方法之前声明.where对象:on。但是,当您使用.build方法定义此对象时,您将无法获得任何目标。

基本上,当您执行.where查找时,您将使用ActiveRecord对后端中的数据表进行ping操作,使用模型中的各种属性填充object(查找{ {3}}了解更多相关信息)

您需要做什么(如果要调用.where创建您希望在数据库中查询的模型的实例。要做到这一点,您必须直接调用模型,或通过关联对象调用:

def index
    @wikis = current_user.wikis.paginate(page: params[:page], per_page: 10)
    @collaborations = Collaboration.where(user_id: current_user.id)
    authorize @wikis
end

<强>系统

当您对Rails不熟悉时,让我告诉您一些有关如何使系统正常工作的详细信息。

首先,您需要了解MVC programming pattern的作用 - 这些作用建立在ActiveRecord Associations之上,使构建&#34;对象&#34;更加简单。围绕数据库驱动的数据

简而言之,如果将两个或多个对象与ActiveRecord关联,则意味着您可以通过主对象调用关联数据:

#app/models/user.rb
Class User < ActiveRecord::Base
   has_many :collaborations
end

#app/models/collaboration.rb
Class Collaboration < ActiveRecord::Base
   belongs_to :user
end

enter image description here

这意味着不是调用@collaborations = Collaboration.where(user_id: current_user.id), you'll simply be able to call @ collaborations = current_user.collaborations`


<强>修正

修复方法如下:

#app/views/wiki/index.html.erb
...
<% current_user.collaborations.each do |collaboration| %>
   <div class="media">
    <div class="media-body">
      <h4 class="media-heading">
        <%= link_to collaboration.title, collaboration %>
      </h4>
     </div>
   </div>
<% end %>

#app/controllers/wikis_controller.rb
Class WikisController < ApplicationController
   def index
    @wikis = current_user.wikis.paginate(page: params[:page], per_page: 10)
    authorize @wikis
   end
end