【问题标题】:Rails 4.1.1 ActiveAdmin undefined method find_or_create_by_idRails 4.1.1 ActiveAdmin 未定义方法 find_or_create_by_id
【发布时间】:2014-06-10 20:46:21
【问题描述】:

我发誓我已尽一切努力避免发布此问题。我整天都在研究这个问题。

每当我尝试删除多个用户或编辑单个用户时,我都会收到以下错误:

A NoMethodError occurred in users#update:

  undefined method `find_or_create_by_id' for #<Class:0x00000006fed200>
  app/admin/users.rb:34:in `block (2 levels) in <top (required)>'

基本上我有一个自定义的 users.rb 文件,内容如下:

app/admin/users.rb

ActiveAdmin.register User do

  config.batch_actions = true
  index do
    selectable_column
    actions defaults: true
    column :id
    column :name
    column :email
    column :current_sign_in_at
    column :last_sign_in_at
    column :sign_in_count
    column :current_sign_in_ip
    column :country
  end


  form do |f|
    f.inputs "User Details" do
      f.input :name
      f.input :email
      f.input :password
      f.input :password_confirmation
      f.input :superadmin, :label => "Super Administrator"
      f.input :ip_address
    end
    f.actions "User Details2" do
      f.action :submit, :as => :button
      f.action :cancel, :as => :link
    end
  end

  create_or_edit = Proc.new {
    @user            = User.find_or_create_by_id(params[:id])
    @user.superadmin = params[:user][:superadmin]
    @user.attributes = params[:user].delete_if do |k, v|
      (k == "superadmin") ||
      (["password", "password_confirmation"].include?(k) && v.empty? && !@user.$
    end
    if @user.save
      redirect_to :action => :show, :id => @user.id
    else
      render active_admin_template((@user.new_record? ? 'new' : 'edit') + '.htm$
    end
  }
  member_action :create, :method => :post, &create_or_edit
  member_action :update, :method => :put, &create_or_edit

end

我已经尝试了所有我能想到的...查看了所有类似的线程...我一无所获。那么有人知道吗?

【问题讨论】:

    标签: ruby-on-rails-4 activeadmin


    【解决方案1】:

    使用以下内容:

    User.where(id: params[:id]).first_or_create
    

    这些查找器自 4 起已弃用,自 4.1 起已删除 http://blog.remarkablelabs.com/2012/12/what-s-new-in-active-record-rails-4-countdown-to-2013

    【讨论】:

    • 我相信你的两种方法都可以,但我更喜欢你的方法,因为它稍微不那么麻烦。我不认为 find_or_create_by 已被弃用......但它应该是。可能最终会(“哪里”更容易使用......)非常感谢。
    • 它实际上已被删除,因为它更干净,而且它不必使用 meta_programming。这就是消息的内容undefined method find_or_create_by_id。这种方法已经不存在了。如果您的应用非常依赖它们,您可以通过要求 gem 将它们放回去:activerecord-deprecated_finders
    • 那么我选择的很明智!
    【解决方案2】:

    您正在寻找User.find_or_create_by(user_id: params[:id])per this postsource code

    注意:它们还没有作为函数被弃用。他们只是将形式更改为this

    【讨论】:

    • 好吧,现在我有一个问题,因为你们俩同时回答,所以我有谁给绿色复选标记...
    • 只是让你知道。他们仍然在轨道上。 4.1 stable 的源代码有他们as you can see here(ctrl-f find_or_create_by 查看用法)我不知道为什么 user1035375 坚持他们不是。他引用了一些博客,该博客只说旧形式已被弃用,这是真的。不过,您没有使用旧形式。我在 Rails 4.1.1 没有 activerecord-deprecated_finders gem 上测试了它,它仍然有效。
    • 在这种情况下,我很高兴我支持你! :) 不过新版本还是更干净了
    猜你喜欢
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    相关资源
    最近更新 更多