2015-10-12 134 views
-2

我得到這個錯誤,對於我的生活我無法弄清楚爲什麼。幫助將不勝感激。 :Ruby on Rails,查看屬性

錯誤3:error displayed after changes

錯誤4:after User.all.each do |user|

錯誤:未定義方法 '各自' 的零:nilClass

我的紅寶石/ 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 
+0

能否請您發佈完整的異常回溯以及該視圖的控制器操作代碼? –

+0

當然,給我一分鐘 –

+0

我爲你添加它 –

回答

1

你可能會得到這條線視圖中的錯誤:

@all_users.each do |user| 

的原因的錯誤,因爲我看到的是,你不必@all_users在您的控制器的index操作方法的任何地方實例化。

第一個開關@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 
+0

謝謝你,虐待現在試試 –

+0

仍然出現同樣的錯誤彈出 –

+0

你能否從你的Rails的控制檯粘貼完整的錯誤? –

0

Undefined method 'each' for nil: nilClass

這個錯誤基本上意味着你沒有在變量任何數據。

在其他語言中,這意味着你沒有delcared變量。因爲Ruby是面向對象的,所以它將使用nilClass類來填充變量。

許多新的Ruby開發者都會拋出「未定義的方法」異常消息;這是你必須留意的nilClass

-

爲了正確地解釋錯誤,因爲Ruby is object orientated,每可變實際上是一個數據對象,通過類表示是。在Rails中,您可以將這些類定義爲模型(User.find等)。

與其他語言不同,Ruby將這些對象視爲 - 它使用方法。其他語言將數據合併到函數中,E.摹PHPeach功能:

#PHP 
<$ each($people) $> 

#Ruby 
<% @people.each do |person| %> 

因此,‘沒有方法’錯誤基本上意味着紅寶石找不到你的nilClass調用方法。它引發開發者,因爲他們認爲「我有類」「上的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 
  1. You're not assigning @all_users at all
  2. You're using an inefficient way to get "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以獲得更清晰的視角。