Wes*_*ter 6 ruby-on-rails ruby-on-rails-3
首先,我正在关注Rails关注的实践(好主意!):https://gist.github.com/1014971
我收到了一个错误:
undefined method `search' for #<Class:0x5c25ea0>
app/controllers/accessories_controller.rb:6:in `index'
Run Code Online (Sandbox Code Playgroud)
我不要有我/应用/型号/关注/目录/config/application.rb加载.所以正在加载"关注"模块.只是想指出这一点.
这是我的代码:
/app/models/concerns/searchable.rb
module Searchable
extend ActiveSupport::Concern
# Add a "search" scope to the models
def self.search (search)
if search
where('name LIKE ?', "%#{search}%")
else
scoped
end
end
end
Run Code Online (Sandbox Code Playgroud)
/app/models/accessory.rb
class Accessory < ActiveRecord::Base
include Searchable
...
end
Run Code Online (Sandbox Code Playgroud)
/app/controllers/accessories_controller.rb
class AccessoriesController < ApplicationController
def index
@accessories = Accessory.search(params[:search])
...
end
end
Run Code Online (Sandbox Code Playgroud)
好吧,随着更多的玩弄,我发现了什么是错的!
当您想要从模块(关注)中直接修改模型时,您需要将功能包装在包含的块中.
我已将我的关注模块更改为以下内容:
module Searchable
extend ActiveSupport::Concern
included do
# Add a "search" scope to the models
def self.search (search)
if search
where('name LIKE ?', "%#{search}%")
else
scoped
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
这就对了!希望这会帮助其他人同样的问题!
这是一个不错的解决方案,但不是真正的最佳解决方案.当您构建模块时,ActiveSupport::Concern
您可以包装一个ClassMethods
在您关注的内部调用的模块,并且包含您关注的任何模块将自动随ClassMethods
模块一起扩展.
那么,更好的解决方案是:
module Searchable
extend ActiveSupport::Concern
module ClassMethods
def search(search)
if search
where('name LIKE ?', "%#{search}%")
else
scoped
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
那(IMO)更清楚地表达了你的意图:将类级方法放入类中.
虽然您的方法有效,但是included
当您需要在调用类上调用方法时,可以更好地使用该方法.例如,您可以坚持您的Searchable
对象具有db-backed name
属性,如下所示.该included
方法是将presence
验证器添加到调用类中,并且用于扩展类的方法明确分开.
module Searchable
extend ActiveSupport::Concern
def self.included(base)
base.send :validates_presence_of, :name
end
module ClassMethods
def search(search)
if search
where('name LIKE ?', "%#{search}%")
else
scoped
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8951 次 |
最近记录: |