我想知道在update_attributes语句之后哪些字段已更新.我正在过滤可更新的参数并删除那些我不想更新的参数params[:model].现在,一些新的可更新参数可能具有与旧的相同的值,并且我想知道哪个参数被更新以及哪一个被跳过,因为相同的值.以下是一些代码:
UPDATABLE_PARAMS = ["param1", "param2", "param3", "param4"]
def update
@dr = DR.find(params[:id])
authorize! :update, @dr #devise stuff
hnew = params[:dr]
hnew.delete_if {|k, v| !UPDATABLE_PARAMS.include?(k.to_s) }
if @dr.update_attributes(hnew)
@dr.update_attribute(:last_updated_by, current_user.email)
@dr.touch
end
render :update_result
end
Run Code Online (Sandbox Code Playgroud)
这是棘手的部分:
我想@dr用JSON 渲染对象(但已经设置了),除了标准字段之外,我还想添加一个包含该对象的嵌套对象updated_params.我可以送hnew的@hnew,以我的观点,但如果我这样做,我会得到所有的加工参数,可以不只是是不同的人.
我怎样才能获得改变的参数?
我最近开始与Sidekiq合作,并注意到它有一个很棒的功能,我已经搜索了很长时间:
UserMailer.delay_until(5.days.from_now).find_more_friends_email
Run Code Online (Sandbox Code Playgroud)
基本上我可以在将来安排工作,所以我不需要我的应用程序连续轮询开始时间的新事件.
现在这就像一个魅力,但我如何改变工作的开始时间?通常,某些预定事件的开始时间会更改.我怎么在sidekiq复制这个?
我知道我可以删除作业并创建一个新作业,但是可以只修改开始时间吗?
编辑:
我建立在Oto Brglez的想法之上,这里是文档化的代码:
module TaskStuff
class TaskSetter
include Sidekiq::Worker
sidekiq_options retry: false
def perform(task_id)
task = Task.find(task_id)
# Get the worker that's performing this job
if worker = AppHelpers.find_worker(jid)
# If the worker matches the "at" timestamp then this is the right one and we should execute it
if worker.last["payload"]["at"].to_s.match(/(\d*\.\d{0,3})\d*/)[1] == task.start.to_f.to_s.match(/(\d*\.\d{0,3})\d*/)[1]
task.execute
else
custom_logger.debug("This worker is the wrong one. Skipping...")
end
else
custom_logger.error("We couldn't find the worker")
end
end
end
end
module AppHelpers …Run Code Online (Sandbox Code Playgroud) 我目前正在编写RoR 3.2中的邮件程序,它会发送应根据用户语言进行本地化的邮件.我设法渲染了正确的本地化视图,但是我在某些需要更改区域设置的字段(如主题)方面遇到了一些困难.我已经阅读了一些反对在发送电子邮件之前更改语言环境的帖子.用户有许多不同的语言,这意味着每次向用户发送电子邮件时都要更改我的语言环境.
我知道可以更改区域设置,发送电子邮件,更改区域设置.这不像铁路的方式.这样做有正确的方法吗?
这是一个片段:
class AuthMailer < ActionMailer::Base
add_template_helper(ApplicationHelper)
default :from => PREDEF_MAIL_ADDRESSES::System[:general]
[...]
def invite(address, token, locale)
@token = token
@locale = locale
@url = url_for(:controller => "signup_requests", :action => "new", :token => token.key, :locale => locale)
mail(:subject => "Invitation", :to => address) do |format|
format.html { render ("invite."+locale) }
format.text { render ("invite."+locale) }
end
end
[...]
end
Run Code Online (Sandbox Code Playgroud)
我的看法
auth_mailer
invite.en.html.erb
invite.en.text.erb
invite.it.html.erb
invite.it.text.erb
...
Run Code Online (Sandbox Code Playgroud)
简而言之,在这种情况下,我想使用@locale本地化:subject,但不是通过运行:I18n.locale = locale
正如标题所暗示的那样.我无法找到与Mongoid 3相关的任何内容.我发现的东西只适用于mongoid那些没有使用的旧版本Moped.
我发现了这个并没有用:
def self.install_javascript
getWeekJs = Rails.root.join("lib/javascript/getWeek.js")
if collection.master['system.js'].find_one({'_id' => "getWeek"}).nil?
collection.master.db.add_stored_function("getWeek", File.new(getWeekJs).read)
end
end
Run Code Online (Sandbox Code Playgroud)
此方法会将getWeek函数添加到system.js集合中.
怎么能在mongoid 3中完成?
在Ruby 2/Rails 3中有一个简单的方法来转换它:
{a: {b: {"1" => 1, "2" => 2}, d: "Something"}, b: {c: 1}}
Run Code Online (Sandbox Code Playgroud)
进入这个:
{"a.b.1" => 1, "a.b.2" => 2, "a.d" => "Something", "b.c" => 1}
Run Code Online (Sandbox Code Playgroud)
我不是在谈论这个精确的哈希,而是将任何哈希转换为点符号哈希.
我有一个非常简单的设置来测试rails3 ActiveSupport::Notifications.通过阅读文档,该ActiveSupport::Notifications.subscribe位应该异步执行它的操作.显然事实并非如此.
例:
ActiveSupport::Notifications.subscribe "some.channel" do |name, start, finish, id, payload|
# do expensive task
sleep(10)
end
ActiveSupport::Notifications.instrument "some.channel" #=> will return 10 seconds later
Run Code Online (Sandbox Code Playgroud)
我的印象是ActiveSupport::Notifications.instrument "some.channel"会马上回来让昂贵的任务做昂贵的事情.否则,我可以直接调用昂贵的任务,而无需使用订户.
该文档还指出可能有多个订阅者.在这种情况下,我会被阻止,直到所有其他订阅者执行他们的代码.
这是正确的吗?如果是,有人可以解释http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html上的这一行是什么意思吗?
The block will be called asynchronously whenever someone instruments “render”:
我有2个应用程序.1是rails app,另一个是node.js.我在Rails应用程序中使用sidekiq.我的node.js应用程序将收到大量的http帖子(至少20 req/sec),我需要这些请求由rails应用程序处理.
我找到的最好的方法是将这些请求放在sidekiq队列中,并让Rails尽可能地处理它们.是否可以从另一个应用程序向sidekiq添加作业?这是通过直接与redis交谈来完成的吗?工作将非常简单:
message_type
source
payload
Run Code Online (Sandbox Code Playgroud)
这些字段存在于初始http post请求中.
我想过直接使用rails作为第一个入口点,但是当涉及到大量并发http请求时,rails并不是那么好.
有关如何从外部轨道向sidekiq队列添加作业的任何想法?
有谁知道jQuery可排序事件的触发顺序是什么?我问这个,因为我有一个问题stop和update.对我来说更有意义的是update事件会在stop事件发生后发生,但情况并非如此.
这是在任何地方记录或有人调查吗?我无法找到合适的列表,我还不想查看代码.
我有一些javascript编写,以验证字符串是字母数字,但我只是想知道如何添加一些代码,包括连字符( - )和斜杠(/)作为可接受的输入.这是我目前的代码:
function validateAddress() {
var address = document.getElementById('address');
if (address.value == "") {
alert("Address must be filled out");
return false;
} else if (document.getElementById('address').value.length > 150) {
alert("Address cannot be more than 150 characters");
return false;
} else if (/[^a-zA-Z0-9\-\/]/.test(address)) {
alert('Address can only contain alphanumeric characters, hyphens(-) and back slashs(\)');
return false;
}
}
Run Code Online (Sandbox Code Playgroud) ruby ×3
javascript ×2
sidekiq ×2
actionmailer ×1
function ×1
jquery ×1
jquery-ui ×1
mongoid3 ×1
node.js ×1
ruby-2.0 ×1
validation ×1