2014-09-29 22 views
-1

我做了一些與模型相關的變量,我想保存與控制結構有關的新變量,但是我不能。它說「NoMethodError - 未定義的方法`保存'爲1:Fixnum:」。未定義的方法`保存'爲1:修正號

我想要做的是該函數如果這個程序得到4人,它會顯示該成員的成員名稱。第五名成員將在下一組。

任何人都可以解決這個問題?

或者如果您需要更多信息,請讓我知道。

由於

這是Waitinglists_controller

class WaitinglistsController < ApplicationController 
     before_action :authenticate 

     def new 
      @waitinglist = current_user.created_waitinglists.build 
     end 

     def create 
      @waitinglist = current_user.created_waitinglists.build(waitinglist_params) 
      if @waitinglist.save 
       redirect_to waitinglist_waiting_path(@waitinglist, @owner) 
      else 
       render :new 
      end 
     end 
    def waiting 

     @group_number = Waitinglist.select(:count_number).last 
     @already_group_people = Waitinglist.where(count_number: @group_number).count 
     @current_person_group_number = current_user.created_waitinglists.select(:count_number) 
     @current_group_people = Waitinglist.where(count_number: @current_person_group_number).count 

     case @already_group_people 

     when 0 
      @current_person_group_number = 1 
      @current_person_group_number.save 

     when 1..2 
      @current_person_group_number = @group_number 
      @current_person_group_number.save 

     when 3 
      @current_person_group_number = @group_number 
      @current_person_group_number.save  
      redirect_to show_waitinglist_path 

     when 4 
      group_number += 1 


      @current_person_group_number = @group_number 
       @current_person_group_number.save 
      end 

    end 

def show 


    @current_person_group_number = current_user.created_waitinglist.select(:count_number) 



     @matched_people = Waitinglist.find(count_number: @current_person_group_number) 

     @matched_people == 0 if @matched_people = nil 
    end 



    private 

    def created_by?(user) 
     return false unless user 
     owner_id == user.id 
    end 

    def waitinglist_params 
     params.require(:waitinglist).permit(:look_like, :id) 
    end 
end 

這是會話控制器,用於用戶洛

class SessionsController < ApplicationController 

    def create 
     user = User.find_or_create_from_auth_hash(request.env['omniauth.auth']) 
     session[:user_id] = user.id 
     redirect_to root_path 
    end 

    def destroy 
     reset_session 
     redirect_to root_path 
    end 


end 

應用contrtoller是本

class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 



    helper_method :current_user, :logged_in? 

    private 

    def current_user 
     @current_user ||= User.find(session[:user_id]) if session[:user_id] 
    end 

    def logged_in? 
     !!session[:user_id] 
    end 

    def authenticate 
     return if logged_in? 
     redirect_to root_path 
    end 

end 

Under code are for models

class Waitinglist < ActiveRecord::Base 
    belongs_to :waiting_person, class_name: 'User' 
    after_initialize :init 

    def init 
     self.count_number ||= 1   #will set the default value only if it's nil 
    end 
end 

class User < ActiveRecord::Base 
    has_many :created_waitinglists, class_name: 'Waitinglist', foreign_key: :owner_id 

    def self.find_or_create_from_auth_hash(auth_hash) 
     provider = auth_hash[:provider] 
     uid = auth_hash[:uid] 
     name = auth_hash[:info][:name] 
     image_url = auth_hash[:info][:image] 

     User.find_or_create_by(provider: provider, uid: uid) do |user| 
      user.nickname = name 
      user.image_url = image_url 
     end 
    end 
end 
+0

我添加了所有模型和控制器。我很高興它會對你有用,幫助我 – 2014-09-29 10:18:43

回答

0

不幸的是,你寫的代碼沒有意義,很難理解你要在這裏做什麼。

首先,你過度使用實例變量。其次,你過度使用select方法。如果你沒有使用他們在另一種方法(這很難說,因爲你沒有發佈其他類的其他方法)

其次,你過度使用select方法。

@group_number = Waitinglist.select(:count_number).last 

它所做的查詢模型數據庫時改變SELECT語句,但它仍返回模式,而不是一個數字或字段值。所以@group_number不是一個數字 - 它是一個WaitingList實例。如果你想要一些事:

group_number = WaitingList.last.count_number 

(如現在的問題可能在第二閉合發佈後會更新,如果這不會發生。)

只能保存ActiveRecord的對象,這意味着你需要把它放在某個地方。如果你想更新@current_person_group_number,但是你不能重新分配這個變量來完成這個技巧。你必須得到整個模型,改變它的屬性,然後保存模型。它看起來像:

current_waiting_list = current_user.created_waitinglists.last # This seems to be a collection, you need to tell here which waiting list you want to get from this collection 
current_waiting_list.count_number += 1 
current_waitin_list.save 

我最後一點是 - 請看看act_as_list gem。由於您正在創建等待列表,因此您必須擁有寶石。

+0

非常感謝。這就是我所需要知道的。下一次當我問我將會如你所說的那樣輸入更多的代碼。@BroiSatse – 2014-09-29 09:54:37

+0

如果可能,你可以再次檢查我的代碼嗎?@BroiSatse – 2014-09-30 15:59:19

3

這對我來說很清楚。您在@current_person_group_number上調用save,這是Fixnum的實例,因此它沒有定義save方法。

+0

感謝您的anwer Marek。那麼如何更改@current_person_group_number?只要把它變成局部變量? – 2014-09-29 08:49:09

+0

@MasanobuMizutani更改變量的範圍不會改變其類型。您需要在作爲模型類實例的對象上調用'save'。您應該修復您的數據庫訪問代碼並獲取正確的對象。 – 2014-09-29 09:05:12

+0

我明白了,謝謝@DirkGrappendorf – 2014-09-29 09:55:06

相關問題