Ruby on Rails,查看属性
Posted
技术标签:
【中文标题】Ruby on Rails,查看属性【英文标题】:Ruby on Rails, View properties 【发布时间】:2015-10-12 03:32:40 【问题描述】:我得到了这个错误,我这辈子都不知道为什么。帮助将不胜感激。 :
错误 3:error displayed after changes
错误 4:after User.all.each do |user|
错误:nil 的未定义方法“每个”:nilClass
我的 ruby/haml 代码如下
查看器代码:
-# This file is app/views/projects/index.html.haml
%h1 All Project Tasks
= form_tag projects_path, :method => :get do
Include:
- @all_users.each do |user|
= user
= check_box_tag "users[#user]", 1, ("checked" if @filtered_users.find_index(user))
= submit_tag 'Refresh', :id => "users_submit"
%table#projects
%thead
%tr
%th:class => ("hilite" if params[:sort] == "title")= link_to "Title", :controller => "projects", :sort => "title", :filter => @filtered_users.to_s, :id => "title_header"
%th Task Details
%th Assigned Usertimot
%th:class => ("hilite" if params[:sort] == "due_date")= link_to "Due Date", :controller => "projects", :sort => "due_date", :filter => @filtered_users.to_s, :id => "due_date_header"
%tbody
- @projects.each do |project|
%tr
%td= project.title
%td= link_to "More about #project.title", project_path(project)
%td= project.user
%td= project.due_date.to_formatted_s(:long)
= link_to 'Add new project task', new_project_path
控制器代码:
class ProjectsController < ApplicationController
def show
id = params[:id] # retrieve project task ID from URI route
@project = Project.find(id) # look up project task by unique ID
# will render app/views/projects/show.<extension> by default
def index
@projects_users = Project.all_users
# remembered settings
if (params[:filter] == nil and params[:users] == nil and params[:sort] == nil and
(session[:filter] != nil or session[:users] != nil or session[:sort] != nil))
if (params[:filter] == nil and session[:filter] != nil)
params[:filter] = session[:filter]
end
if (params[:sort] == nil and session[:sort] != nil)
params[:sort] = session[:sort]
end
redirect_to projects_path(:filter => params[:filter], :sort => params[:sort], :users => params[:users])
else
if (params[:filter] != nil and params[:filter] != "[]")
@filtered_users = params[:filter].scan(/[\w-]+/)
session[:filter] = params[:filter]
else
@filtered_users = params[:users] ? params[:users].keys : []
session[:filter] = params[:users] ? params[:users].keys.to_s : nil
end
end
session[:sort] = params[:sort]
session[:users] = params[:users]
if (params[:sort] == "title")
if ( params[:users]or params[:filter] )
@projects = Project.find(:all, :order => "title")
end
end
if (params[:sort] == "due_date")
if ( params[:users]or params[:filter] )
@projects = Project.find(:all, :order => "due_date")
end
if (params[:sort] == nill)
if(params[:users] or params[:filter])
@projects = Project.all
end
end
end
end
def new
# default: render 'new' template
end
def create
@project = Project.create!(project_params)
flash[:notice] = "#@project.title was successfully created."
redirect_to projects_path
end
def edit
@project = Project.find params[:id]
end
def update
@project = Project.find params[:id]
@project.update_attributes!(project_params)
flash[:notice] = "#@project.title was successfully updated."
redirect_to project_path(@project)
end
def destroy
@project = Project.find(params[:id])
@project.destroy
flash[:notice] = "Project '#@project.title' deleted."
redirect_to projects_path
end
private
def project_params
params.require(:project).permit(:title, :description, :extended_description, :user, :due_date)
end
end
end
我知道 haml 的间距可能有点偏,只是尝试格式化代码块的性质提前谢谢!
查看器代码:
class Project < ActiveRecord::Base
def self.all_users
allUsers = []
Project.all.each do |project|
if (allUsers.find_index(project.user) == nil)
allUsers.push(project.user)
end
end
return allUsers
end
end
【问题讨论】:
能否请您发布完整的异常回溯以及此视图的控制器操作代码? 当然,等一下 【参考方案1】:您可能会在您的视图中看到此行的错误:
@all_users.each do |user|
我看到的错误原因是您没有在控制器的index
操作方法中的任何地方实例化@all_users
。
首先将@all_users
切换为@projects_users
。此外,您在project.rb
中的all_users
方法似乎过于复杂并且正在返回nil
。尝试将project.rb
修改为以下内容:
class Project < ActiveRecord::Base
def self.all_users
all.includes(:user).map(&:user).uniq
end
end
【讨论】:
能否请您从 Rails 控制台粘贴完整的错误信息? 谢谢。在您的app/models/project.rb
文件中,您是否定义了一个名为all_users
的方法或范围?我猜你会这样做并且它正在返回nil
。你能分享一下它的内容吗?
我刚刚将 AllUsers 更改为 all_users,不确定这是否是朝着正确方向迈出的一步,但无论如何它仍然会出错
和以前一样的错误,要我再发一张截图吗?
如果您将视图中的行从 @all_users.each do |user|
切换到 User.all.each do |user|
是否有效?【参考方案2】:
nil 的未定义方法“每个”:nilClass
这个错误基本上意味着你你的变量中没有任何数据。
在其他语言中,这意味着您没有删除该变量。因为 Ruby 是面向对象的,所以它将使用 nilClass
类填充变量。
许多新的 Ruby 开发者被“未定义的方法”异常消息抛出;这是您必须注意的nilClass
。
--
正确解释错误,因为Ruby is object orientated,每个变量实际上都是一个数据对象,由一个类表示。在 Rails 中,您可以将这些类定义为模型(User.find
等)。
与其他语言不同,Ruby 按原样对待这些对象——它对它们使用方法。其他语言将数据放入函数中,例如php
的each
函数:
#PHP
<$ each($people) $>
#Ruby
<% @people.each do |person| %>
因此,“无方法”错误基本上意味着 Ruby 无法找到您在 nilClass
上调用的方法。它会抛出开发人员,因为他们认为 “我在 User
类上有 x
方法”,没有意识到变量已被 nilClass
填充。
简而言之,您必须将调用设置为有条件的,或者正确填充变量。
错误似乎在这里:
#app/views/project/index.html.haml
@all_users.each do |user|
#app/controllers/projects_controller.rb
class ProjectsController < ApplicationController
def index
@projects_users = Project.all_users
end
end
您根本没有分配
@all_users
您正在使用一种低效的方式来获取“所有用户”
这是我要做的:
#app/controllers/projects_controller.rb
class ProjectsController < ApplicationController
def index
@users = Project.all_users
end
end
#app/models/project.rb
class Project < ActiveRecord::Base
scope :all_users, -> joins(:users) #-> this needs to be tested
end
#app/views/projects/index.haml
- @users.each do |user|
= user.name
我对纯 SQL 非常缺乏经验,您最好参考joins
documentation 以获得更清晰的视角。
【讨论】:
以上是关于Ruby on Rails,查看属性的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails - 针对相同数据查看两个不同的过滤器
使用SASS for Ruby on Rails时如何使用border-radius属性删除导航栏圆角?