我在has_one关系中遇到accepts_nested_attributes_for时遇到问题.
模特:购买和销售.
class Purchase < ActiveRecord::Base
has_one :sale, :dependent => :destroy
accepts_nested_attributes_for :sale
end
class Sale < ActiveRecord::Base
belongs_to :purchase
end
Run Code Online (Sandbox Code Playgroud)
在控制器/新动作中:
@purchase = Purchase.new(
:club_id => @club.id,
:subcategory_id => subcategory.id
)
Run Code Online (Sandbox Code Playgroud)
在视图(HAML)中:
- form_for(@purchase) do |f|
# some fields for purchase
- f.fields_for :sale do |s|
= s.text_field :amount, :size => 6
# and so on
Run Code Online (Sandbox Code Playgroud)
问题:这实际上并没有在我的视图中呈现任何待售的输入框.购买字段呈现正常,但销售字段不会出现.
如果我将此行添加到控制器:
@purchase.sale.build
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
class Purchase < ActiveRecord::Base
has_many :sales, :dependent => :destroy
accepts_nested_attributes_for :sales
end
Run Code Online (Sandbox Code Playgroud)
为了使事情变得更奇怪,如果我将关联类型更改为has_many而不是has_one,从而创建:
class Purchase < ActiveRecord::Base
has_one :sale, …
Run Code Online (Sandbox Code Playgroud) 在IOS5中,使用故事板,假设您有一个UISplitViewController,它有一些视图被设置为正常的主视图和详细视图.其中一个详细视图被设置为UISplitViewController的初始详细视图控制器,因此它在故事板中的大小是普通详细视图的大小.其他细节视图来自此详细视图,并且由于segue关系,其大小也与正常细节视图一样.
当然,当您更改设备的方向时,它们都会动态调整大小.到现在为止还挺好.
现在假设您添加了另一个UIViewController,您打算将其用作UISplitView的详细视图.但是,在这种情况下,您将以编程方式将其设置为详细视图,而不是使用"替换"segue.
在故事板上,此视图将是全尺寸的,即它看起来不像是详细视图.这使得在故事板中布置界面成为问题.
在附带的屏幕截图中,您可以看到最右侧的视图是一个完整大小的视图.我想在故事板中制作大小详细视图.
这是怎么做到的?我在属性检查器中尝试了各种大小和选项的组合,但似乎没有什么效果.显而易见的选择是属性检查器的"模拟指标"部分中的"大小:细节",但这似乎什么都不做.
我们在Heroku上构建并部署了一个应用程序,这个应用程序上的某些进程已经开始超时,我迫切需要将它们移到后台进程.
我使用delayed_job完成了这项工作,并仔细按照Heroku文档中有关如何设置它的步骤进行操作.在当地,这工作正常.
但是,在生产中,创建延迟的作业会抛出401.此错误似乎发生在我们的应用程序之外,即不在我们编写的代码中.我几乎完全被这个错误所困扰,因为它似乎处理了很多Heroku内部.我将粘贴我们在发生这些类型的错误时获得的异常通知电子邮件的部分内容.
A Heroku::API::Errors::Unauthorized occurred in surveys#export:
Expected(200) <=> Actual(401 Unauthorized)
request => {:chunk_size=>1048576, :connect_timeout=>60, :headers=>{"Accept"=>"application/json", "Accept-Encoding"=>"gzip", "Authorization"=>"Basic Og==", "User-Agent"=>"heroku-rb/0.3.5", "X-Ruby-Version"=>"1.9.3", "X-Ruby-Platform"=>"x86_64-linux", "Host"=>"api.heroku.com:443"}, :instrumentor_name=>"excon", :mock=>false, :nonblock=>false, :read_timeout=>60, :retry_limit=>4, :ssl_ca_file=>"/app/vendor/bundle/ruby/1.9.1/gems/excon-0.16.4/data/cacert.pem", :ssl_verify_peer=>true, :write_timeout=>60, :host=>"api.heroku.com", :path=>"/apps/msu/ps", :port=>"443", :query=>nil, :scheme=>"https", :expects=>200, :method=>:get}
response => #<Excon::Response:0x0000000957d7e0 @body="{\"error\":\"Access denied\"}", @headers={"Cache-Control"=>"no-cache", "Content-Type"=>"application/json; charset=utf-8", "Date"=>"Tue, 13 Nov 2012 17:00:05 GMT", "Server"=>"nginx/1.2.3", "Status"=>"401 Unauthorized", "Strict-Transport-Security"=>"max-age=500", "X-Runtime"=>"11", "Content-Length"=>"25", "Connection"=>"keep-alive"}, @status=401>
vendor/bundle/ruby/1.9.1/gems/excon-0.16.4/lib/excon/connection.rb:290:in `request_kernel'
Run Code Online (Sandbox Code Playgroud)
vendor/bundle/ruby/1.9.1/gems/excon-0.16.4/lib/excon/connection.rb:290:in `request_kernel'
vendor/bundle/ruby/1.9.1/gems/excon-0.16.4/lib/excon/connection.rb:101:in …
Run Code Online (Sandbox Code Playgroud) 我正在寻找有关如何为一个棘手的问题构建优雅解决方案的指导.虽然我使用的是Ruby(和Rails),但我认为我的问题主要是建筑问题,尽管我对语言的选择显然会对涉及图书馆等的建议产生影响,因此语言仍然具有相关性.
无论如何,简而言之:我的应用程序包含代表会员资格的对象,属于健身设施成员.会员资格包含一系列定期付款.有些会员资格会在学期结束时自动续约,而其他会员则不会.
因此,例如,您可能拥有初始期限为一年的成员资格,然后在此之后每月更新一次.在应用程序中,创建此类成员资格会导致创建12个定期付款.当上个月到期时,会员资格也会到期.每日cron任务负责导致成员资格根据已完成的付款到期.如果成员资格设置为自动续订,则相同的cron任务将续订成员资格.
您可能还拥有没有初始任期的会员资格,只需按月或按周运行.这些工作方式类似,减去最初的付款时间安排.
到现在为止还挺好.使事情变得复杂的是附加要求:
管理员可以"冻结"成员资格(暂停),持续特定的持续时间,之后他们会自动重新激活(例如代表在一段时间内去度假的人).我现在可以选择冻结成员资格并稍后重新激活,或者我可以选择通过在将来的某个时间点设置冻结日期来安排冻结,以及重新激活日期(注意:始终有重新激活日期,这让事情变得容易一些).
管理员可以立即取消会员资格,也可以在将来设置取消.(未来的取消尚未建成.)
管理员可以退还会员资格,这类似于取消,除非过去的付款都退还.
使这些难以处理的原因是对经常性支付的影响.冻结成员资格时,定期付款必须在冻结期间"延长",以便不支付代表冻结的时间段.这在概念上和编程上都难以处理.例如,付款可以延长不同时期(即,每隔一周付费的人的每次付款支付两周的会员资格),并且取消日期可以是付款所涵盖的期间内的任何地方.
对于冻结,我采用了成员资格对象包含一些日期的方法,即"freeze_on"和"thaw_on"来处理冻结期.然而,客户现在也希望将来取消,我注意到冻结功能的一些错误,这让我相信我需要重新考虑我的方法.
我正在考虑改变事情,以便可以安排未来的事件,但对应用程序的经常性付款部分没有影响.想法是排队特定事件.例如,未来的冻结将通过在特定日期排队冻结事件和在后续日期解冻事件来完成(这两个事件将从用户的角度连接到单个"预定冻结").未来取消将以类似方式处理.
这种方法有一些好处,例如,如果你想取消未来的取消(这是我正在谈论的那种烦人的,棘手的东西),你可以简单地从事件队列中删除预定的取消.
然而,我有一种唠叨的感觉,我可能只是从煎锅跳进火里.我想知道是否有人可以就此问题向我提供一些指导.我可以检查这类问题的设计模式或现有架构原则吗?
另外需要注意的是,对于具有预定条款的会员资格(即不是每月自动续订)的定期付款必须作为可编辑的数据库记录(及时移动,价格调整)存在,因此使用时间表达式(如Martin据我所知,福勒建议不适合这个问题.我意识到我提议的事件队列解决方案不会向用户显示任何现有定期付款会发生的变化,但我认为我可以接受这一点.
不是扫描生活条形码,它是一个二维码
多伦多,给我们你的创意人
编辑:回应下面两个很好的建议(评论框不允许几乎这个级别的细节):
克里斯罗宾逊:
是的,冻结期可以是任意长度,但实际上我认为它不到两周就很少见.但无论期间长短,任何解决方案都应该有效.
是的,更新日期会发生变化 - 它会被冻结的长度推进.因此,如果冻结时间为两周,则会将付款推迟两周.为了使事情变得特别棘手,在某些企业中,付款只能在特定日期提取 - 例如,某些俱乐部仅在每个月的1日和15日处理付款.因此,当日期被推迟时,对于这些俱乐部,他们必须"抓住"特定日期.
您能否更详细地解释为什么这些规则会影响事件排队而不影响订阅付款的管理?
我对您的摊销表概念感兴趣.这基本上就是我已经建立的 - 一个为期一年的会员每月支付创造了12个,每周创造了52个 - 并且每个都有与他们相关的金额,税收等,以及管理的状态机"待定","已付款","失败"和"退款"状态.
我正在努力的部分是这个表如何响应事件.现在,如果您设置冻结,它会立即通过更改付款日期来影响表格.在表格中间设置冻结,然后向前推送付款.这听起来很有效,但它实际上非常复杂且难以管理.您的摊销表如何改善这种情况?
Arsen7:
这听起来像我最初提出的事件队列.我很明显你以前曾经使用过这样的东西(我对你的处理日期的错误检查印象深刻,这是一个好主意,我打算尽快实施)所以我希望你能解释一下你的建议更详细一点.
具体来说,我想知道你的概念将如何处理我在原始问题中描述的经常性付款情况,以及我刚刚在Kris Robison的回答中留下的评论.如果我已经为特定购买设置了定期付款的时间表,并且在付款中间安排了冻结事件,那么付款时间表将保持不变,直到冻结日期变为当前日期为止.冻结的时间到了,付款会继续下去吗?
这对我来说可能是一种简化我的应用程序的好方法,但我想知道用户如何看待它.我如何向他们表明他们在安排冻结时所看到的付款时间表不再是准确的时间表,但一旦冻结就会改变?
由于荒谬的SOAP身份验证方案,我需要md5使用其他一些参数来散列API密钥.不幸的是,提供的唯一示例代码是用PHP编写的,由于我觉得不可思议的原因,它要求md5哈希在PHP中使用可选的raw_output标志(http://php.net/manual/en/function.md5.php)这导致它返回二进制(然后我必须base64编码).
我的应用程序是用Ruby编写的,如果我不需要,我不想将这部分推迟到PHP文件中.但是,我似乎无法找到如何让Ruby以二进制形式返回哈希值.当我在PHP中正常散列它时,输出与我的Ruby输出匹配,但这不是他们要求的.
PHP:
<?php
$encode = "test";
echo md5($encode); // 098f6bcd4621d373cade4e832627b4f6
echo "\n";
// PHP5 - md5 with raw_output flag set to true - what I need to mimic in Ruby
echo md5($encode, true); // binary that looks something like: ?k?F!?s??N?&'??
echo "\n";
?>
Run Code Online (Sandbox Code Playgroud)
红宝石:
require 'digest/md5'
encode = "test"
puts Digest::MD5.hexdigest(encode) # 098f6bcd4621d373cade4e832627b4f6
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏.
我是Coffeescript的新手,我在翻这个Javascript时遇到了麻烦:
Handlebars.registerHelper("debug", function(optionalValue) {
console.log("Current Context");
console.log("====================");
console.log(this);
if (optionalValue) {
console.log("Value");
console.log("====================");
console.log(optionalValue);
}
});
Run Code Online (Sandbox Code Playgroud)
进入工作Coffeescript.我想,我想要的部分是如何将"debug"参数传递给registerHelper函数,还传入一个带有可选参数的匿名函数.
这个语法:
Handlebars.registerHelper: "debug", -> (optionalValue)
console.log("Current Context")
console.log("====================")
console.log(this)
if optionalValue
console.log("Value")
console.log("====================")
Run Code Online (Sandbox Code Playgroud)
不适合我.
ruby ×2
architecture ×1
coffeescript ×1
datetime ×1
delayed-job ×1
encryption ×1
hash ×1
heroku ×1
ios ×1
ios5 ×1
javascript ×1
objective-c ×1
php ×1
uistoryboard ×1
xcode ×1