小编Okt*_*tav的帖子

调用update_attributes后查找哪些字段已更新?

我想知道在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,以我的观点,但如果我这样做,我会得到所有的加工参数,可以不只是是不同的人.

我怎样才能获得改变的参数?

ruby-on-rails update-attributes

10
推荐指数
1
解决办法
3966
查看次数

Ruby on Rails + Sidekiq:如何更改预定的作业开始时间?

我最近开始与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)

ruby ruby-on-rails sidekiq

8
推荐指数
2
解决办法
9286
查看次数

Ruby on Rails 3.2 Mailer,本地化邮件主题字段

我目前正在编写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

actionmailer ruby-on-rails-3

7
推荐指数
2
解决办法
6530
查看次数

使用Mongoid 3在mongodb中存储函数

正如标题所暗示的那样.我无法找到与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-on-rails mongoid3

7
推荐指数
1
解决办法
597
查看次数

经典哈希到点符号哈希

在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)

我不是在谈论这个精确的哈希,而是将任何哈希转换为点符号哈希.

ruby ruby-on-rails ruby-on-rails-3 ruby-2.0

4
推荐指数
1
解决办法
1621
查看次数

ActiveSupport :: Notifications应该是异步的吗?

我有一个非常简单的设置来测试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”:

ruby ruby-on-rails-3

3
推荐指数
1
解决办法
1835
查看次数

从node.js向rails-sidekiq队列添加作业

我有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队列添加作业的任何想法?

node.js ruby-on-rails-3 sidekiq

2
推荐指数
1
解决办法
1272
查看次数

jQuery UI Sortable:事件顺序

有谁知道jQuery可排序事件的触发顺序是什么?我问这个,因为我有一个问题stopupdate.对我来说更有意义的是update事件会在stop事件发生后发生,但情况并非如此.

这是在任何地方记录或有人调查吗?我无法找到合适的列表,我还不想查看代码.

javascript jquery jquery-ui

2
推荐指数
1
解决办法
3529
查看次数

特殊字符验证

我有一些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)

javascript validation function

1
推荐指数
1
解决办法
6万
查看次数