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 按原样对待这些对象——它对它们使用方法。其他语言将数据放入函数中,例如phpeach函数:

#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属性删除导航栏圆角?

ruby on rails 网页上如何实时显示服务器网速?

Ruby on Rails 和 Netezza 后端

chardinjs 不在 ruby​​ on rails 中工作

在 ruby​​ on rails 中公开函数