希望我能在这里获得所有术语 - 如果不是请原谅,还是非常新的。
我正在开设一个课程项目@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
干杯 凯文。
答案 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
这意味着不是调用@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