假设我正在抽象代码,并且循环遍历对象x的列名,那么检测列是否为关联的最佳方法是什么?
我知道我可以做到这一点,但我想知道是否有更好的方法:
@user = User.first
@user.attributes.keys.each do |column|
if column[-3..-1] == "_id" && @user.respond_to?(column[0..-4].to_sym)
puts "#{column} is an association / relation."
else
puts "#{column} is not an assocation / relation."
end
end
end
Run Code Online (Sandbox Code Playgroud)
任何内置的Rails方法或助手来检测关联?上面的代码既不漂亮,也不是万无一失.谢谢!
我有点困惑,即使它正常工作如何工作.我有一个与同一个其他模型有两个关联的模型.
公司拥有一个所有者和公司拥有许多类用户的员工.
这是我的公司型号:
class Company < ActiveRecord::Base
validates_presence_of :name
has_many :employee, :class_name => 'User'
has_one :owner, :class_name => 'User'
accepts_nested_attributes_for :owner, :allow_destroy => true
end
Run Code Online (Sandbox Code Playgroud)
这是我的用户模型:
class User < ActiveRecord::Base
include Clearance::User
attr_accessible :lastname, :firstname #other attr are whitelisted in clearance gem
validates_presence_of :lastname, :firstname
belongs_to :company
end
Run Code Online (Sandbox Code Playgroud)
现在假设我有这家公司的3名员工,包括业主.当我第一次创建公司时,我将所有者设置为id为1的员工,另外两个(2,3)通过设置company_id(user.company = company)添加到员工列表中.所有这三个都将他们的company_id设置为公司ID,我们可以假设为1
当我要求company.owner时,我得到了正确的用户,当我做公司工作时,我得到了全部三个.
如果我将所有者更改为用户2,则会通过将用户1的company_id设置为nil来自动从员工中删除用户1.这很好,如果我把他作为一个简单的员工加回来,一切都还是不错的.
铁路怎么知道哪个是哪个?我的意思是,它是如何知道员工是所有者而不仅仅是员工?架构中没有任何内容定义此内容.
我有一种感觉,我应该扭转所有者协会,让公司属于一个用户.
我正在尝试在迁移中定义一个方法,但我得到一个未定义的方法错误:
undefined method 'do_something_specific' for #<ActiveRecord::ConnectionAdapters::SQLite3Adapter:0x4868018>
Run Code Online (Sandbox Code Playgroud)
我宁愿不在其他地方定义它,因为它并不真正与应用程序的其余部分相关,只是这个特定的迁移.
要清楚,我的迁移看起来像:
class DoSomethingSpectacular < ActiveRecord::Migration
def self.up
do_something_specific(1, 2)
end
def self.down
end
private
def do_something_specific(p_1, p_2)
# something happens here...
end
end
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?为什么我不能这样定义?
我知道我可以strip_tags在视图中使用ActionView帮助器方法来清理输出,但是在将用户输入保存到我的数据库之前,清除用户输入的最佳方法是什么?我应该找到一种方法在我的控制器中包含视图助手并重用strip_tags方法吗?我认为rails会在全球范围内提供一些类似的东西.
我正在开发一个Rails(目前是2.3.4)应用程序,该应用程序利用子域来隔离独立的帐户站点.要明确的是,我的意思是foo.mysite.com应该显示foo帐户的内容,bar.mysite.com应该显示栏的内容.
确保所有模型查询都限定在当前子域的最佳方法是什么?
例如,我的一个控制器看起来像:
@page = @global_organization.pages.find_by_id(params[:id])
Run Code Online (Sandbox Code Playgroud)
(注意@global_organization是通过subdomain-fu在application_controller中设置的.)当我喜欢的是:
@page = Page.find_by_id(params[:id])
Run Code Online (Sandbox Code Playgroud)
Page模型找到的位置自动限定在正确的组织中.我尝试过使用default_scope指令,如下所示:(在Page模型中)
class Page < ActiveRecord::Base
default_scope :conditions => "organization_id = #{Thread.current[:organization]}"
# yadda yadda
end
Run Code Online (Sandbox Code Playgroud)
(再次,请注意,相同的application_controller将Thread.current [:organization]设置为组织的全局访问ID.)此方法的问题是默认范围在第一个请求上设置,并且永远不会在后续请求中更改不同的子域名.
到目前为止有三种明显的解
1为每个子域使用单独的vhost,并且每个子域只运行应用程序的不同实例(使用mod_rails).此方法不适用于此应用.
2使用上面的原始控制器方法.不幸的是,应用程序中有相当多的模型,许多模型都是从组织中删除的一些连接,因此这种表示法很快变得很麻烦.更糟糕的是,这主动要求开发人员记住并应用限制或冒重大安全问题.
3使用before_filter重置每个请求的模型的默认范围.不确定此处的性能或如何最好地选择要更新的模型.
思考?我还缺少其他任何解决方案吗?这似乎是一个普遍的问题,必须有一个最佳实践.感谢所有投入,谢谢!
我正在尝试使用我创建的插件为rails创建一个ruby gem.问题是我的插件"快捷方式"使用了一些需要在public/javascripts目录中运行的javascript文件.
什么是制作这些javascript文件的最佳方法,这些文件位于我创建的gem中,可以访问哪个项目需要我的gem?
我在控制器中有以下功能
def by_xy
@obj = BldPoly::find_by_xy(:x => params['x'], :y => params['y'])
respond_to do |format|
format.html { render :layout => false }
format.xml { render :layout => false }
format.json { render :layout => false }
end
Run Code Online (Sandbox Code Playgroud)
并计划以下列方式编写自动测试
xml = nil
get :by_xy, {:x => 4831, :y => 3242, :format => :json}
assert_nothing_thrown { xml = REXML::Document.new(@response.body) }
td = REXML::XPath.first(xml, "//result/item")
assert_equal need_value, td.value
Run Code Online (Sandbox Code Playgroud)
我在50ms内完成(查看:0,DB:230)| 406不可接受[ http://test.host/search/by_xy/4831/3242.json]
当我错过测试代码格式时 - 一切正常,
我该怎么写测试?
我在Ubuntu服务器上设置了Ruby 1.9.1(p234).我正在尝试部署一个Rails应用程序,它在Apache 2.2/Passenger 2.2.5上提供Rails 2.3-stable.
GET请求正常工作,POST请求立即中断以下日志条目:
Processing UsersController#new (for 80.203.77.44 at 2009-10-24 20:54:55) [GET]
Parameters: {"controller"=>"users", "action"=>"new"}
Rendering template within layouts/application
Rendering users/new
Completed in 23ms (View: 20, DB: 0) | 200 OK [http://myapp/user/new]
/!\ FAILSAFE /!\ 2009-10-24 20:55:01 +0200
Status: 500 Internal Server Error
closed stream
/usr/local/lib/ruby/gems/1.9.1/gems/passenger-2.2.5/vendor/rack-1.0.0-git/lib/rack/rewindable_input.rb:86:in make_rewindable'
/usr/local/lib/ruby/gems/1.9.1/gems/passenger-2.2.5/vendor/rack-1.0.0-git/lib/rack/rewindable_input.rb:26:inread'
/usr/local/lib/ruby/gems/1.9.1/gems/passenger-2.2.5/vendor/rack-1.0.0-git/lib/rack/request.rb:136:in POST'
/usr/local/lib/ruby/gems/1.9.1/gems/passenger-2.2.5/vendor/rack-1.0.0-git/lib/rack/methodoverride.rb:15:incall'
/var/www/myapp/app/releases/20091021213913/vendor/rails/actionpack/lib/action_controller/params_parser.rb:15:in call'
/var/www/myapp/app/releases/20091021213913/vendor/rails/actionpack/lib/action_controller/session/cookie_store.rb:93:incall'
/var/www/myapp/app/releases/20091021213913/vendor/rails/actionpack/lib/action_controller/failsafe.rb:26:in call'
/usr/local/lib/ruby/gems/1.9.1/gems/passenger-2.2.5/vendor/rack-1.0.0-git/lib/rack/lock.rb:11:inblock in call'
:8:in synchronize'
/usr/local/lib/ruby/gems/1.9.1/gems/passenger-2.2.5/vendor/rack-1.0.0-git/lib/rack/lock.rb:11:incall'
/var/www/myapp/app/releases/20091021213913/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:106:in call'
/usr/local/lib/ruby/gems/1.9.1/gems/passenger-2.2.5/lib/phusion_passenger/rack/request_handler.rb:95:inprocess_request'
/usr/local/lib/ruby/gems/1.9.1/gems/passenger-2.2.5/lib/phusion_passenger/abstract_request_handler.rb:207:in main_loop'
/usr/local/lib/ruby/gems/1.9.1/gems/passenger-2.2.5/lib/phusion_passenger/railz/application_spawner.rb:378:instart_request_handler' … 对于一个新的应用程序,我想开始涉足BDD,我试图在使用RSpec或Thoughtbot的Shoulda之间做出决定.我喜欢Shoulda使用的宏,以及它似乎没有重新发明Ruby/Rails测试的方式,而只是提供了一个附加组件.另一方面,宏似乎有点太"神奇",而不是明确你正在测试的东西(但是我知道,从涉及写一打很烦人"应该是无效的,没有xxx"两行上一个模型).说实话,我发现编写模型的规格/测试很简单,而且几乎非常容易,但我觉得为控制器编写它们是非常困难的,因为我不确定我应该测试什么或者如何编写它.
因为我认为它们给你错误的假设(因为你可以告诉它认为它有你需要的任何数据或者假装方法X被调用)我不知道嘲弄和抄写的主题我知道RSpec重使用它们.我喜欢RSPec生成的文档,但我正在创建一个销售应用程序,而不是给客户端,因此漂亮的文档并没有那么有用.我喜欢Cucumber,但它似乎有点矫枉过正(是的,我知道它可以和Shoulda一起使用).
在这一点上,Rails社区支持RSpec或Shoulda?
如何使用javascript/jquery在html字符串中查找和替换begin标签和结束标签
例如
var myString = "<span> Hello john</span><div> John likes to play guitar </div> <div style="color:Blue;font-weight:bold" class='quotes'>Anna likes to arrange flowers
</div>";
Run Code Online (Sandbox Code Playgroud)
我需要找到"div"标签并替换为其他html标签,如"p"标签/"span"标签
将"div"标记替换为"p"标记后生成的html字符串
var replacestring="<span> Hello john</span><p> John likes to play guitar </p> <p style="color:Blue;font-weight:bold" class='quotes'>Anna likes to arrange flowers
</p>";
Run Code Online (Sandbox Code Playgroud)
请建议任何解决方案.
activerecord ×2
javascript ×2
bdd ×1
gem ×1
input ×1
jquery ×1
migration ×1
passenger ×1
rails-models ×1
rspec ×1
ruby ×1
ruby-1.9 ×1
sanitize ×1
shoulda ×1
xss ×1