1

Rails 4.0 を実行しています。ルビー2.0

サインアップするために、私はユーザーに新しいページでメールを提供するように頼むだけです.

update アクションで、ユーザーに名前を尋ねます。

Index アクションでユーザーをリストするとき、ユーザーが自分の名前を更新したことだけを表示したい。

ユーザーが自分の名前を更新したかどうかに基づいてスコープを設定する必要があることはわかっています。

ユーザーモデル

scope :name, where(name: true)

ユーザーコントローラー

def index
  @users = User.name
end

エラー

undefined method `gsub' for #

問題は方法だと思います。スコープを呼び出しています。私は既存のものを使用する必要があるかもしれませんか?

どんな助けでも大歓迎です。ありがとうございました。

4

2 に答える 2

3

個人的には、もう少し慣習的にするために、私は使用します

class User < ActiveRecord::Base
  scope :has_name, where("users.name != ''")
end

nameこのようにして、モデルが別のモデルと結合されたときに、複数のテーブルに列がある場合に列のあいまいさが発生することはありません


この例を考えてみましょう

$ rails new app
$ cd app
$ rails g resource User name:string company_id:integer
$ rails g resource Company name:string
$ rake db:migrate

私たちのモデル

class User < ActiveRecord::Base
  belongs_to :company
  scope :has_name, where("name != ''")
end

class Company < ActiveRecord::Base
  has_many :users
end

問題

$ rails c
irb> User.has_name.join(:company)

いやいや!

User Load (0.4ms)  SELECT "users".* FROM "users" INNER JOIN 
  "companies" ON "companies"."id" = "users"."company_id" WHERE 
  (name != '')

SQLite3::SQLException: ambiguous column name: name: SELECT
  "users".* FROM "users" INNER JOIN "companies" ON 
  "companies"."id" = "users"."company_id" WHERE (name != '')

ActiveRecord::StatementInvalid: SQLite3::SQLException: ambiguous 
  column name: name: SELECT "users".* FROM "users" INNER JOIN 
  "companies" ON "companies"."id" = "users"."company_id" WHERE 
  (name != '')

スコープを固定しよう

class User < ActiveRecord::Base
  belongs_to :company
  scope :has_name, where("users.name != ''")
end

クエリを再実行します

irb> reload!
irb> User.has_name.join(:company)

適切な出力

User Load (0.1ms)  SELECT "users".* FROM "users" INNER JOIN "companies" 
  ON "companies"."id" = "users"."company_id" WHERE (users.name != '')

=> []
于 2013-11-08T18:22:13.500 に答える
1

あなたが使用することができます:

scope :with_name, where("name <> ''")

上記は、彼らが実際に名前を変更したかどうかを示していませんが、空白ではないということだけです. name 列の変更を追跡したい場合は、PaperTrail gemのようなものを使用できます。

追加のフィードバックに基づいて、次のことをお勧めします。

scope :with_name, where("users.name != ''")
于 2013-11-08T18:00:35.393 に答える