我正在开发一个Rails应用程序,它使用API后端来处理用Sinatra编写的AJAX请求.
API与Rails分开运行:
Rails: localhost:3000
API: localhost:9393
在生产中,我们将使用nginx代理对API的请求.
问题是我们在开发模式下没有nginx,我们使用的是瘦身.所以我需要某种Rack中间件,我可以在开发模式中添加它来代理我的请求.
有人能给我一个如何做到这一点的例子吗?
我在nginx + unicorn后面运行了一系列Rails/Sinatra应用程序,零停机时间部署.我喜欢这个设置,但Unicorn完成重启需要一段时间,所以我想在完成后发送一些通知.
我可以在Unicorn docs中找到的唯一回调与worker forking有关,但我不认为那些会对此有用.
这就是我从赏金中寻找的东西:旧的独角兽大师启动新的主人,然后启动它的工人,然后旧的主人停止其工人并让新的主人接管.我想在切换完成时执行一些ruby代码.
理想情况下,我不想实现任何复杂的流程监控来执行此操作.如果这是唯一的方式,那就这样吧.但是在我走这条路之前我正在寻找更简单的选择.
对不起,这一点到处都是......但是我觉得自己像一条狗在追逐我的尾巴而且我在这一点上都很困惑.
我正在尝试看到开发3层解决方案(IL,BL,DL)的最简洁方法,其中DL使用ORM来抽象对数据库的访问.
在我看过的每个地方,人们使用LinqToSQL或LLBLGen Pro生成表示数据库表的对象,并在所有3个层中引用这些类.似乎已经忽略了40年的编码模式 - 或者发生了范式转换,我错过了解释部分,为什么它完全可以这样做.
然而,似乎还有一些基础要求数据存储机制不可知 - 看看LinqToSQL刚刚发生了什么:很多代码是针对它编写的 - 只有MS才能放弃它...所以我想我尽可能地隔离ORM部分,只是不知道如何.
所以,回到绝对基础,这里是我希望以非常干净的方式组装的基本部分:
我开始的程序集:UL.dll BL.dll DL.dll
主要课程:
Message类,其具有公开MessageAddress对象的集合(称为MessageAddresses)的属性:
class Message
{
public MessageAddress From {get;}
public MessageAddresses To {get;}
}
Run Code Online (Sandbox Code Playgroud)
每层功能:
BL向UI公开一个名为GetMessage(Guid id)的UI,它返回一个Message实例.
BL反过来包裹DL.
DL有一个ProviderFactory,它包装了一个Provider实例.DL.ProviderFactory公开(可能是我的一部分问题)两个名为GetMessage(Guid id)的静态方法,以及SaveMessage(消息消息)最终目标是能够换出为Linq2SQL编写的提供程序一个用于LLBLGen Pro,或另一个不支持ORM的提供商(例如VistaDB).
设计目标:我想要分层.我希望每个图层都只依赖于它下面的图层,而不是它上面的图层.我希望ORM生成的类只在DL层中.我希望UL与BL共享Message类.
因此,这是否意味着:
a)消息在BL中定义b)DB表中的Db/Orm/Manual表示('DbMessageRecord',或'MessageEntity',或其他任何ORM调用它)在DL中定义.c)BL依赖于DL d)在调用DL方法之前,没有ref或知道BL,BL必须将它们转换为BL实体(例如:DbMessageRecord)?
UL:
Main()
{
id = 1;
Message m = BL.GetMessage(id);
Console.Write (string.Format("{0} to {1} recipients...", m.From, m.To.Count));
}
Run Code Online (Sandbox Code Playgroud)
BL:
static class MessageService
{
public static Message GetMessage(id)
{
DbMessageRecord message = DLManager.GetMessage(id);
DbMessageAddressRecord[] messageAddresses = DLManager.GetMessageAddresses(id);
return MapMessage(message,
}
protected …Run Code Online (Sandbox Code Playgroud) 使用此插件时是否有一种简单的方法来显示整个嵌套集?我想要做的是显示一个无序的根节点列表,每个子节点中还有另一个无序列表,其中也包含子节点等等?
任何建议表示赞赏
谢谢.
我一直在尝试Javascript中的设计模式,这将允许我拥有可以被实例函数覆盖的单例函数.
这是一个简短的例子:
Date.tomorrow = function () {
return Date.today().add(1).days();
}
(function(p) {
p.tomorrow = function() {
var date = this.clone().clearTime();
return date.equals(Date.tomorrow());
}
})(Date.prototype);
Run Code Online (Sandbox Code Playgroud)
所以有两个tomorrow()功能.直接从Date函数调用时:
>>> Date.tomorrow()
=> Fri Jul 23 2010 00:00:00 GMT-0500 (CST) { _orient=1, more...}
Run Code Online (Sandbox Code Playgroud)
但是,当您首先实例化Date实例时:
>>> var date = new Date()
>>> date.tomorrow()
=> false
Run Code Online (Sandbox Code Playgroud)
我很遗憾,因为我相信你能分辨出来,但希望你能明白这一点.我的问题是:第一个tomorrow()函数与Date对象的关系是什么?究竟是什么附属于什么?
假设您使用的是普通函数,而不是构造函数.是否可以从原始函数中调用增强函数?
在构造函数中,您可以这样做:
this.constructor.functionName();
Run Code Online (Sandbox Code Playgroud)
但如果该函数未被用作构造函数,显然该constructor引用将不存在.有没有其他方法来访问增强功能?
这个问题背后的动力源于我重新组织项目JS代码的工作.我们正在实现Sprockets系统将我们的源代码分解为模块,其中基本上是在我们去的时候装饰一个基本命名空间,而不是将它们全部打包在一个不可读的内联对象定义中.
我们有一些非常大的事件连接,这很好分成单独的函数,但我宁愿不必单独调用每个函数; 相反,我想要一个可以一次调用所有子功能的超级功能.
我总是可以创建一个all()函数或者其他东西来实现这一点,但是如果调用顶级函数执行所有附加到它的子函数,那么从API的角度看它会更清晰.
感谢Francisco的回应,我现在正在实现我的想法.这是一个例子,以防任何人好奇.
var Namespace = {};
var Namespace.wireup = (function () {
return …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的用户帐户和会话数据移动到一个单独的数据库中,以便我们最终可以跨多个应用程序共享它.
我在网上看到很多人说用来establish_connection告诉模型连接到不同的数据库,但是我无法让它工作.
配置/ database.yml的
development:
adapter: mysql2
encoding: utf8
reconnect: true
pool: 5
host: localhost
database: project_name_development
authentication:
adapter: mysql2
encoding: utf8
reconnect: true
pool: 5
host: localhost
database: authentication
Run Code Online (Sandbox Code Playgroud)
应用程序/模型/ user.rb
class User < ActiveRecord::Base
establish_connection :authentication
has_one :person
end
Run Code Online (Sandbox Code Playgroud)
应用程序/模型/ person.rb
class Person < ActiveRecord::Base
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
这似乎有效:
> User.connection.instance_eval { @config[:database] }
=> "authentication"
> Person.connection.instance_eval { @config[:database] }
=> "project_name_development"
Run Code Online (Sandbox Code Playgroud)
我可以User孤立地查询:
> User.where(:admin => true)
=> [ ... lots of results …Run Code Online (Sandbox Code Playgroud) 我有一个项目,使用Sinatra的静态页面和Rails的应用程序.
我允许请求通过以下方式执行此操作config.ru:
run Rack::Cascade.new([
EightyEightTactical::Root,
EightyEightTactical::Application
])
Run Code Online (Sandbox Code Playgroud)
当EightyEightTactical::Root是的子类Sinatra::Base和EightyEightTactical::Application是的子类Rails::Application.
我处在一个棘手的情况,我需要在Rails控制器中设置一个flash消息并以Sinatra布局显示它.
我注意到Rails ActionDispatch::Flash在中间件中使用,但我似乎无法弄清楚如何在Rails应用程序之外访问flash消息.我错了,还是可以这样做?
我正在编写一个名为Person的简单Rails模型has_many :phone_numbers,我试图以复杂的形式保存电话号码,而无需手动编写setter方法.accepts_nested_attributes_for应该做我想要的但我无法让它工作.这是我到目前为止的代码:
移民
class CreatePeople < ActiveRecord::Migration
def self.up
create_table :people do |t|
t.string :first_name
t.string :last_name
t.integer :address_id
t.string :email
t.timestamps
end
end
def self.down
drop_table :people
end
end
class CreatePhoneNumbers < ActiveRecord::Migration
def self.up
create_table :phone_numbers do |t|
t.string :number, :limit => 10
t.string :extension, :limit => 5
t.string :description, :null => false
t.integer :telephone_id
t.string :telephone_type
t.timestamps
end
end
def self.down
drop_table :phone_numbers
end
end
Run Code Online (Sandbox Code Playgroud)
楷模
class Person < ActiveRecord::Base
has_one :address, :as …Run Code Online (Sandbox Code Playgroud) 我发现自己在控制器中写了很多这样的代码:
params[:task][:completed_at] = Time.parse(params[:task][:completed_at]) if params[:task][:completed_at]
Run Code Online (Sandbox Code Playgroud)
不要特意挂在我在这里做的事情,因为每次都会改变原因; 但是在很多情况下我需要检查参数中的值并在将其交给create或之前进行更改update_attributes.
重复params[:task][:completed_at]三次感觉非常糟糕.有一个更好的方法吗?
我有一个购买模型的has_one 优惠券.
该购买模型包含以下代码:
def decrement_coupon
coupon = Coupon.find_by_code(coupon_code, :readonly => false)
return unless coupon.respond_to?(:uses)
coupon.uses = coupon.uses - 1
coupon.save
end
Run Code Online (Sandbox Code Playgroud)
但是前几天我收到了这个错误:
ActiveRecord::ReadOnlyRecord - ActiveRecord::ReadOnlyRecord:
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/persistence.rb:245:in `create_or_update'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/callbacks.rb:273:in `create_or_update'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activesupport-3.0.6/lib/active_support/callbacks.rb:419:in `_run_save_callbacks'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/callbacks.rb:273:in `create_or_update'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/persistence.rb:39:in `save'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/validations.rb:43:in `save'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/attribute_methods/dirty.rb:21:in `save'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/transactions.rb:240:in `save'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/transactions.rb:292:in `with_transaction_returning_status'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/connection_adapters/abstract/database_statements.rb:139:in `transaction'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/transactions.rb:207:in `transaction'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/transactions.rb:290:in `with_transaction_returning_status'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/transactions.rb:240:in `save'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/transactions.rb:251:in `rollback_active_record_state!'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/transactions.rb:239:in `save'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/associations/association_proxy.rb:222:in `send'
/usr/local/rvm/gems/ree-1.8.7-2010.02@lyconic/gems/activerecord-3.0.6/lib/active_record/associations/association_proxy.rb:222:in `method_missing'
/var/www/88tactical_production/releases/20110823232510/app/models/purchase.rb:69:in `decrement_coupon'
Run Code Online (Sandbox Code Playgroud)
并:readonly => false不能保证一个非只读记录?将此功能移至优惠券模型会有所作为吗?(无论如何,我可能会这样做)
ruby ×3
sinatra ×2
activerecord ×1
ajax ×1
arel ×1
c# ×1
deployment ×1
forms ×1
function ×1
idioms ×1
inheritance ×1
javascript ×1
join ×1
middleware ×1
nested-sets ×1
nginx ×1
oop ×1
orm ×1
prototype ×1
rack ×1
readonly ×1
unicorn ×1