小编Har*_*tty的帖子

如何设置datetime列的默认值以记录迁移中的创建时间?

考虑下面的表创建脚本:

create_table :foo do |t|
  t.datetime :starts_at, :null => false
end
Run Code Online (Sandbox Code Playgroud)

是否可以将默认值设置为当前时间?

我试图在rails中找到DB独立的等价物,用于下面给出的SQL列定义:

Oracle语法

start_at DATE DEFAULT SYSDATE() 
Run Code Online (Sandbox Code Playgroud)

MySQL语法

start_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)

要么

start_at DATETIME DEFAULT NOW()
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails

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

访问模型中的current_user

我有3张桌子

items (columns are:  name , type)
history(columns are: date, username, item_id)
user(username, password)
Run Code Online (Sandbox Code Playgroud)

当用户说"ABC"登录并创建新项目时,将使用以下after_create过滤器创建历史记录.如何通过此过滤器将此用户名"ABC"分配给历史记录表中的用户名字段.

class Item < ActiveRecord::Base
  has_many :histories
  after_create :update_history
  def update_history
    histories.create(:date=>Time.now, username=> ?) 
  end
end
Run Code Online (Sandbox Code Playgroud)

我在session_controller中的登录方法

def login
  if request.post?
    user=User.authenticate(params[:username])
    if user
      session[:user_id] =user.id
      redirect_to( :action=>'home')
      flash[:message] = "Successfully logged in "
    else
      flash[:notice] = "Incorrect user/password combination"
      redirect_to(:action=>"login")
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我没有使用任何身份验证插件.如果有人能告诉我如何在不使用插件(如userstamp等)的情况下实现这一点,我将不胜感激.

ruby-on-rails

39
推荐指数
4
解决办法
4万
查看次数

SELECT子句中没有聚合函数时的GROUP BY行为

我有一个emp包含以下结构和数据的表:

name   dept    salary
-----  -----   -----
Jack   a       2
Jill   a       1
Tom    b       2
Fred   b       1
Run Code Online (Sandbox Code Playgroud)

当我执行以下SQL时:

SELECT * FROM emp GROUP BY dept
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

name   dept    salary
-----  -----   -----
Jill   a       1
Fred   b       1
Run Code Online (Sandbox Code Playgroud)

在什么基础上服务器决定返回吉尔和弗雷德并排除杰克和汤姆?

我在MySQL中运行此查询.

注1:我知道查询本身没有意义.我试图用'GROUP BY'方案调试问题.我试图理解为此目的的默认行为.

注2:我习惯于编写与GROUP BY子句相同的SELECT子句(减去聚合字段).当我遇到上述行为时,我开始想知道我是否可以依赖于以下场景:从emp表中选择薪水是dept中最低/最高的行.例如:像这样的SQL语句适用于MySQL:

SELECT A.*, MIN(A.salary) AS min_salary FROM emp AS A GROUP BY A.dept
Run Code Online (Sandbox Code Playgroud)

我没有找到任何描述这种SQL工作原理的材料,更重要的是如果我能够始终如一地依赖这种行为.如果这是一个可靠的行为,那么我可以避免以下查询:

SELECT A.* FROM emp AS A WHERE A.salary = ( 
            SELECT MAX(B.salary) FROM emp B WHERE B.dept = A.dept)
Run Code Online (Sandbox Code Playgroud)

mysql sql

37
推荐指数
2
解决办法
4万
查看次数

根域上的Heroku SSL

我正在尝试为我的heroku应用程序设置SSL.我使用的是基于主机名的SSL插件.heroku 文档说明如下:

Hostname based SSL will not work with root domains as it relies on CNAME 
aliasing of your custom domain names. CNAME aliasing of root domains is 
an RFC violation. 
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,当我使用www子域访问网站时,一切都运行良好,即https://www.foo.com.当我访问https://foo.com时,浏览器会抱怨,因为提供的证书是针对heroku.com的.

我得出结论,我必须将foo.com的流量重定向到www.foo.com以解决此问题.我正在考虑以下方法:

1)基于DNS的重定向

该DNS提供商Zerigo 支持重定向记录.我在SO上遇到过关于类似主题的问题.我尝试了解决方案,它只适用于HTTP重定向(Zerigo文档证实了这一点).

我的Zerigo配置:

foo.com      A             x.x.x.x
foo.com      redirect      http://www.foo.com
www.foo.com  CNAME         zzz.amazonaws.com
Run Code Online (Sandbox Code Playgroud)

2)基于机架的重定向

添加基于机架的中间件以执行重定向.该规范的主机宝石提供这样的支持.

use CanonicalHost do
  case Rails.env.to_sym
    when :staging     then 'staging.foo.com'
    when :production  then 'www.foo.com'
  end …
Run Code Online (Sandbox Code Playgroud)

ssl ruby-on-rails heroku

33
推荐指数
2
解决办法
7401
查看次数

我如何调用超类方法

我有两节课A,和B.类B重写了类的foo方法A.Class B有一个bar方法,我想调用foo超类的方法.这种电话的语法是什么?

class A    
 def foo
   "hello"
 end    
end


class B < A
 def foo
  super + " world"
 end

 def bar
   # how to call the `foo` method of the super class?
   # something similar to
   super.foo
 end
end
Run Code Online (Sandbox Code Playgroud)

对于类方法,我可以通过显式地为类名添加前缀来在继承链上调用方法.我想知道是否有类似的习惯用法.

class P
 def self.x
   "x"
 end
end

class Q < P
 def self.x
   super + " x"
 end

 def self.y
   P.x
 end
end
Run Code Online (Sandbox Code Playgroud)

编辑 …

ruby

30
推荐指数
4
解决办法
4万
查看次数

ERB模板删除尾随线

我有一个用于发送电子邮件的ERB模板.

Name: <%= @user.name %>
<% if @user.phone.present? %>
Phone: <%= @user.phone %>
<% end %>
Address: <%= @user.address %>
Run Code Online (Sandbox Code Playgroud)

我试图删除之间的空白行NameAddress何时Phone为空.

返回结果

Name: John Miller 

Address: X124 Dummy Lane, Dummy City, CA
Run Code Online (Sandbox Code Playgroud)

预期结果

Name: John Miller 
Address: X124 Dummy Lane, Dummy City, CA
Run Code Online (Sandbox Code Playgroud)

我试图使用<%--%>标签(删除尾随的新行)没有任何成功.

Name: <%= @user.name %>
<%- if @user.phone.present? -%>
Phone: <%= @user.phone %>
<%- end -%>
Address: <%= @user.address -%>
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

PS:我在Rails 2.3.8上.

注1

现在,我正在使用ruby hackery解决这个问题.

助手方法:

def …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails erb

23
推荐指数
4
解决办法
2万
查看次数

如何在Ruby中的YAML文件中包含YAML文件

在YAML中是否有自定义标记,以便在YAML文件中包含YAML文件?

#E.g.:  
--- !include
filename: another.yml
Run Code Online (Sandbox Code Playgroud)

前一段时间问了一个类似的问题,没有相关的答案.

我想知道是否有是Ruby一些自定义标签类似这样一个为Python.

ruby yaml ruby-on-rails

17
推荐指数
3
解决办法
2万
查看次数

如何检测after_save回调中是否更改了回形针附件?

看起来像Paperclip不尊重ActiveRecord脏模型.如何检测after_save回调中的更改.

class User

  has_attachment :avatar    
  after_save :do_something

  def do_something
    if name_changed?
      #
    end

    # How to determine avatar was changed?
    #if avatar_changed?
    #  #
    #end

  end
end
Run Code Online (Sandbox Code Playgroud)

注意

我知道我可以before_save通过avatar.dirty?调用检测回调的变化,但dirty保存后该标志设置为false.

我可以添加处理器,但是我需要在保存模型数据后执行我的操作.

ruby-on-rails paperclip

14
推荐指数
2
解决办法
5014
查看次数

是否内置支持rails的默认值替换习惯用法?

我经常编写代码以在遇到nil/empty值时提供默认值.

例如:

category = order.category || "Any"
#  OR
category = order.category.empty? ? "Any" : order.category
Run Code Online (Sandbox Code Playgroud)

我即将扩展该try方法来处理这个习语.

category = order.try(:category, :on_nill => "Any")
#  OR
category = order.try(:category, :on_empty=> "Any")
Run Code Online (Sandbox Code Playgroud)

我想知道Rails/Ruby是否有一些方法来处理这个习惯用法?

注意:

我试图消除重复的 || / or / ?基于操作员的习语.

基本上我正在寻找try处理默认替换方案的等效方法.

没有try方法:

product_id = user.orders.first.product_id unless user.orders.first.nil? 
Run Code Online (Sandbox Code Playgroud)

随着try方法:

product_id = user.orders.first.try(:product_id)
Run Code Online (Sandbox Code Playgroud)

很容易实现处理这个习惯用法的通用方法,但我想确保不重新发明轮子.

ruby ruby-on-rails

13
推荐指数
1
解决办法
6026
查看次数

延迟作业:如何在开发模式下的每次调用期间重新加载有效负载类

我正在经营一名工作延迟的工人.当我调用该foo方法时,工作人员打印hello.

class User
  def foo
    puts "Hello"
  end
  handle_asynchronously :foo
end
Run Code Online (Sandbox Code Playgroud)

如果我对foo方法进行了一些更改,我必须重新启动worker才能反映更改.在开发模式中,这可能变得非常烦人.

我试图找到一种方法来为每个请求重新加载有效载荷类(在本例中为User类).我尝试使用Monkey修补DelayedJob库,以便require_dependency在有效负载方法调用之前调用.

module Delayed::Backend::Base
  def payload_object_with_reload
    if Rails.env.development? and @payload_object_with_reload.nil?
      require_dependency(File.join(Rails.root, "app", "models", "user.rb"))
    end
    @payload_object_with_reload ||= payload_object_without_reload
  end
  alias_method_chain :payload_object, :reload
end
Run Code Online (Sandbox Code Playgroud)

这种方法不起作用,因为使用的类require_dependency需要在调用之前重新加载,我还没有想出如何做到这一点.我花了一些时间阅读调度程序代码,以弄清楚Rails如何为每个请求重新加载类.我无法找到重新加载代码.

以前有人试过这个吗?你怎么建议我继续?或者你有任何指针来查找Rails类重载代码?

ruby-on-rails delayed-job

13
推荐指数
1
解决办法
2311
查看次数

标签 统计

ruby-on-rails ×8

ruby ×3

delayed-job ×1

erb ×1

heroku ×1

mysql ×1

paperclip ×1

sql ×1

ssl ×1

yaml ×1