繁体   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