簡體   English   中英

紅寶石-NoMethodError:未定義的方法“狀態”

[英]ruby - NoMethodError: undefined method `status'

我要創建一個按鈕,單擊該按鈕時應更改其狀態。(打開<=>停止)。 但是我不知道如何獲得地位的價值。 當我運行這段代碼=>

@project.project_users.status = !@project.project_users.status # flop the status

它出現 !! #<NoMethodError: undefined method 'status' for #<ProjectUser::ActiveRecord_Associations_CollectionProxy:0x007feb80dcb540>> 有人可以給我一些方法來獲取@project.project_users.status? 謝謝!

controllers / project_users_controller.rb

def flog
    @project.project_users.status = !@project.project_users.status # flop the status
    @project_user.save
    redirect_to project_project_user_path(project_user)
end

views / project_users / show.html.erb

<%= link_to (@project_user.status ? "open" : "stop"), flog_project_project_user_path(@project, @project_user) %>

config / routes.rb

resources :projects, only:[:index, :show, :new, :create, :mypage] do
resources :project_users, only:[:index, :show, :create] do
    member do
      get :flog
    end
end

型號/project_user.rb

    enum status: { open: 1, stop: 2, hidden: 3, closed: 9 }

這里有多個問題。 首先,您要嘗試在project_users 集合上調用實例方法-這就是為什么看到此錯誤的原因。

您需要改為執行以下操作:

@project.project_users.each do |project_user|
  project_user.status = !project_users.status
end

...或者也許您可以只訪問以下其中一個集合:

@project.project_user.status = !@project.project_user.status

...或者您在這里實際打算的是:

@project_user.status = !@project_user.status

...但是即使那樣也行不通,因為您已將status定義為enum而不是布爾值。 如果要在openstop之間切換狀態,則需要在代碼中編寫。 (並決定如何處理statushidden / closed 。)

順便說一句,如果status 一個布爾值,則可以使用內置方法: project_user.toggle!(:status)在這里。

您還不一致地使用單詞flog (??!)而不是flop來表示路由/控制器動作; 您應該解決該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM