如何使用Ruby on Rails 3解决NoMethodError问题

时间:2015-03-20 07:11:03

标签: ruby ruby-on-rails-3

其实我想在管理端页面上显示Magazine模型的所有数据但是我在尝试获取管理端的所有数据时遇到以下错误(即http://localhost:3000/homes/magazineissue).I也想显示一些属于User的值通过用户的身份证明。

错误:

NoMethodError in HomesController#magazineissue

undefined method `user_id' for #<Array:0x2780b98>
Rails.root: C:/Site/library_management1

Application Trace | Framework Trace | Full Trace
app/controllers/homes_controller.rb:100:in `magazineissue'

我的代码如下。

的观点/舍/ magazineissue.html.erb:

<% if admin_signed_in? %>
<div class="bar">
  Logged in as <strong><%= current_admin.email %></strong>.
  <%= link_to 'Edit profile', edit_admin_registration_path, :class => 'navbar-link' %> |
  <%= link_to "Logout", destroy_admin_session_path, method: :delete, :class => 'navbar-link'  %>
</div>
<% else %>
  <%= link_to "Sign up", new_admin_registration_path, :class => 'navbar-link'  %> |
  <%= link_to "Login", new_admin_session_path, :class => 'navbar-link'  %>
<% end %>
<div class="big-container">
<div class="admin-image">
 <div class="bpaddingdiv1"><img src="/assets/admin.png" border="0" name="admin" /></div>
</div>
<div class="borderlightgreen"></div>
<div class="admin-name">
<div class="tpaddingdiv2 textaligncenterdiv"><img src="/assets/adminpanel.png" border="0" name="admin" /></div>
</div>
<div class="leftside">
<div id="leftsidebtn">
 <ul>
<li><a href="/homes/managebooks">Manage Books</a></li>
<li><a href="/homes/userissues" >User Issues</a></li>
<li><a href="/homes/magazineissue" >Magazine Issues</a></li>
 </ul>  
</div>
</div>
<div class="middlebox">
<center>
    <table>
        <thead>
            <tr>
            <th>First Name</th>
            <th>Email Id</th>
            <th>Magazine Name</th>
            <th>Magazine Title</th>
            <th>Purchased on</th>
            <th>CD/DVD</th>
        </tr>
        </thead>
        <tbody>
            <% @magazines.each do |magazine| %>
            <tr>
            <td><%= @users.first_name %></td>
            <td><%= @users.email %></td>
            <td><%= magazine.mag_name %></td>
            <td><%= magazine.mag_title %></td>
            <td><%= magazine.purchased_on %></td>
            <td><%= magazine.cd_dvd %></td>
        </tr>
        <% end %>
        </tbody>
    </table>
</center>
</div>
</div>

视图/控制器/ homes_controller.rb:

class HomesController < ApplicationController
     before_filter :authenticate_admin!,only: [:admin]
    def index

    end
    def admin

    end
    def managebooks
        @books=Book.new
        if params[:id]
            @books=Book.find(params[:id])
            @book=Book.all
        end
    end
    def savebooks
        @books=Book.new(params[:books])
        if @books.save
            flash[:notice]="Data has submitted successfully"
            flash[:color]="valid"
            redirect_to :action => 'managebooks',:id => @books.id
        else
            flash[:notice]="Data couldnot submitted successfully"
            flash[:color]="invalid"
            render 'managebooks'
        end
    end
    def remove
        @books=Book.find(params[:id])
        @books.destroy
    end
    def books

    end
    def showbooks
        @books=Book.all
    end
    def searchbooks
        @books=Book.all
    end
    def member
        @users=User.new
    end
    def registration
        @users=User.new
    end
    def savedata
        @users=User.new(params[:users])
        if @users.save
            flash[:notice]="Data has submitted successfully"
            flash[:color]="valid"
            redirect_to :action => 'member'
        else
            flash[:notice]="Data could not submitted successfully"
            flash[:color]="invalid"
            render 'registration'
        end
    end
    def issuebooks
        @issues=Issue.new
    end
    def savedissuebooks
        @issues=Issue.new(params[:issues])
        if @issues.save
            flash[:notice]="information has saved successfully"
            flash[:color]="valid"
            redirect_to :action => 'member'
        else
            flash[:notice]="Data couldnot saved"
            flash[:color]="invalid"
            render 'issuebooks'
        end
    end
    def availablebooks

        @books=Book.all
    end
    def userissues
        @issues=Issue.all
    end
    def magazine
        @magazines=Magazine.new
    end
    def savemagazines
        @users=User.find(params[:id])
        @magazines=Magazine.new(params[:magazines])
        @magazines.user_id=@users.id
        if @magazines.save
            flash[:notice]="Data submitted successfully"
            flash[:color]="valid"
            redirect_to :action => "member"
        else
            flash[:notice]="Data could not saved"
            flash[:color]="invalid"
            render 'magazines'
        end
    end
    def magazineissue
        @magazines=Magazine.all
        @users=User.find(@magazines.user_id)
    end
end

分贝/迁移/ 20150317084229_create_magazines.rb

class CreateMagazines < ActiveRecord::Migration
  def change
    create_table :magazines do |t|
      t.string :mag_name
      t.boolean :cd_dvd
      t.decimal :cost, :precision => 8, :scale => 2
      t.date :purchased_on
      t.string :mag_title
      t.integer :user_id

      t.timestamps
    end
  end
end

模型/ magazine.rb

class Magazine < ActiveRecord::Base
  attr_accessible :cd_dvd, :cost, :mag_name, :mag_title, :purchased_on
  belongs_to :user
end

模型/ user.rb

class User < ActiveRecord::Base
  attr_accessible :address, :email, :first_name, :last_name, :password, :password_hash, :password_salt, :tel_no ,:password_confirmation
  attr_accessor :password
  before_save :encrypt_password
 EMAIL_REGEX = /\A[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\z/i
 validates :email, :presence => true, :uniqueness => true, :format => EMAIL_REGEX
 validates :first_name, :presence => true, :length => {:in => 3..10}
 validates :last_name , :presence => true , :length => {:in => 3..10}
 validates :tel_no , :presence => true , :length => {:in => 1..10}
 validates :password, :confirmation => true
 validates_length_of :password, :in => 6..20, :on => :create
 def self.authenticate(email, password)
    user = find_by_email(email)
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
      user
    else
      nil
    end
  end

  def encrypt_password
    if password.present?
      self.password_salt = BCrypt::Engine.generate_salt
      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
    end
  end
  has_many :issue
  has_many :book
  has_many :magazine
end

请帮我解决此错误。

2 个答案:

答案 0 :(得分:0)

问题在于您已经提到的控制器 - 让我们来看看:

def magazineissue
    @magazines=Magazine.all
    @users=User.find(@magazines.user_id)
end

在这里,您提取Array Magazine个 - Array没有id方法。我想你想做的是:

def magazineissue
    @magazines=Magazine.all
    @users=User.find(@magazines.map(&:user_id))
end

通过所有User获取Magazine秒。

让我知道它是否有帮助!

<强>更新

从评论中我们看起来你正试图实现类似的目标:

def magazineissue
    @magazines=Magazine.includes(:user).all
end

在您看来,将<table>更改为:

<table>
    <thead>
        <tr>
            <th>First Name</th>
            <th>Email Id</th>
            <th>Magazine Name</th>
            <th>Magazine Title</th>
            <th>Purchased on</th>
            <th>CD/DVD</th>
        </tr>
    </thead>
    <tbody>
        <% @magazines.each do |magazine| %>
            <tr>
                <td><%= magazine.user.first_name %></td>
                <td><%= magazine.user.email %></td>
                <td><%= magazine.mag_name %></td>
                <td><%= magazine.mag_title %></td>
                <td><%= magazine.purchased_on %></td>
                <td><%= magazine.cd_dvd %></td>
            </tr>
        <% end %>
    </tbody>
</table>
祝你好运!

答案 1 :(得分:0)

正如您所定义的那样:

@magazines = Magazine.all

它产生一个包含所有杂志的数组。

现在你正在做HomeController:

@magazines.user_id

引发:

undefined method `user_id' for #<Array:0x2780b98>

因为如上所述@magazines是一个数组。

解决此问题的方法是从返回的Magazine数组中选择一个特定的@magazines对象并继续。

一个简单的例子可以是:

@users=User.find @magazines.first.user_id
# However this is just for sake of example.
# You may want to select an object from the Array more wisely.