我的应用程序控制器中有一个before_filter来保持用户的会话处于活动状态(如果已经超时,则将其注销).这应该在除/ sessions/new和/ sessions/destroy之外的每个动作上调用,这些动作被路由为/ login和/ logout.
我的应用程序控制器的相关部分看起来像这样;
class ApplicationController < ActionController::Base
before_filter :update_activity_time, :except => [:login, :logout]
private
def update_activity_time
if current_user
time_out = current_user.setting.remember_me ? 20160 : current_user.setting.user_timeout
from_now = time_out.minutes.from_now
end
if session[:expires_at].blank?
session[:expires_at] = from_now
else
time_left = (session[:expires_at].utc - Time.now.utc).to_i
if time_left <= 0
session_expiry
else
session[:expires_at] = from_now
end
end
end
def session_expiry
reset_session
flash[:notice] = 'Your session has expired. Please log back in.'
unless request.xhr?
session[:return_to] = request.request_uri
redirect_to login_url
else
session[:return_to] = request.referer
render …Run Code Online (Sandbox Code Playgroud) 我正在创建一个rails应用程序,并在我的一个方法中使用了此代码
item_numbers.inject(0) {|sum, i| sum + i.amount}
Run Code Online (Sandbox Code Playgroud)
item_numbers是我的item_numbers表中的一个对象数组.我应用于它们的.amount方法在一个单独的表中查找item_number的值,并将其作为BigDecimal对象返回.显然,inject方法然后添加所有返回的i.amount对象,这很好用.
我只是好奇为什么当我把这句话写成时它不起作用
item_numbers.inject {|sum, i| sum + i.amount}
Run Code Online (Sandbox Code Playgroud)
根据我可信赖的镐书,这些应该是等价的.是因为i.amount是BigDecimal吗?如果是这样,为什么它现在有用?如果没有,那么为什么它不起作用.
我在我的Rails应用程序中有一个私有方法连接到Amazon S3,执行传递的代码块,然后关闭与S3的连接.看起来像这样;
def S3
AWS::S3::Base.establish_connection!(
:access_key_id => 'Not telling',
:secret_access_key => 'Really not telling'
)
data = yield
AWS::S3::Base.disconnect
data
end
Run Code Online (Sandbox Code Playgroud)
它被称为这样(作为一个例子);
send_data(S3 {AWS::S3::S3Object.value("#{@upload_file.name}",'bucket')}, :filename => @upload_file.name)
Run Code Online (Sandbox Code Playgroud)
我在我的控制器和模型中以多种方式调用此方法,因此将它作为私有方法包含在两个类中.这很好用,我很高兴,但它不是很干.
如何让我的模型和控制器都可以访问此方法,但只能让代码出现一次?这是一个Ruby问题而不是Rails问题,反映了我对OOP的新见解.我猜测一个模块或混合是答案,但我到目前为止还没有真正使用其中任何一个,需要一点手握.
谢谢.
我想在2个具有多对一关系的表中进行搜索,例如
class User << ActiveRecord::Base
has_many :pets
end
class Pet << ActiveRecord::Base
belongs_to :users
end
Run Code Online (Sandbox Code Playgroud)
现在让我们说我有一些这样的数据
users
id name
1 Bob
2 Joe
3 Brian
pets
id user_id animal
1 1 cat
2 1 dog
3 2 cat
4 3 dog
Run Code Online (Sandbox Code Playgroud)
我想要做的是创建一个活动记录查询,它将返回一个既有猫又有狗的用户(即用户1 - Bob).
到目前为止,我的尝试是
User.joins(:pets).where('pets.animal = ? AND pets.animal = ?','dog','cat')
Run Code Online (Sandbox Code Playgroud)
现在我明白了为什么这不起作用 - 它正在寻找一只既是狗又是猫的宠物,所以什么也不回报.我不知道怎么修改这个给我答案我想要的.有没有人有什么建议?这似乎应该很容易 - 它似乎不是一个特别不寻常的情况.
- -编辑 - -
我刚刚发现了Squeel,只是在这个问题上添加了一点点尾声.这允许您构建这样的子查询;
User.where{id.in(Pet.where{animal == 'Cat'}.select{user_id} & id.in(Pet.where{animal == 'Dog'}.select{user_id}))
Run Code Online (Sandbox Code Playgroud)
这将是我的应用程序的方式.
我正在努力获得一个regexp(在Ruby中),它将提供以下内容
"one, two" -> "one"
"one, two, three" -> "one"
"one two three" -> "one two three"
Run Code Online (Sandbox Code Playgroud)
我希望匹配任何字符直到字符串中的第一个逗号.如果没有逗号,我希望整个字符串匹配.到目前为止,我的最大努力是
/.*(?=,)?/
Run Code Online (Sandbox Code Playgroud)
这从以上示例产生以下输出
"one, two" -> "one"
"one, two, three" -> "one, two"
"one two three" -> "one two three"
Run Code Online (Sandbox Code Playgroud)
关闭但没有雪茄.有人可以帮忙吗?
我刚刚开始使用rails 3应用程序,它具有父模型和子模型(父has_many:children).
我正在尝试进行设置,以便在创建新父级之后,用户将被带到该父级的显示操作(/ parent/id).在这个视图中,我包括部分显示任何孩子和表单来创建一个新孩子.创建新子项后,用户将被重定向到将显示新子项的父项的show操作.这一切都按预期工作.
但是,如果我尝试验证新子窗体中的字段,则出现的任何错误消息都不会出现在窗体中(视图中的必要行是正确的 - 从生成的脚手架代码中剪切并粘贴).有没有办法将孩子的这些错误消息成功传递给父节目动作?
以下是相关代码的片段;
从我的父控制器:
def show
@parent = Parent.find(params[:id])
@child = @parent.children.new
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @admission }
end
end
Run Code Online (Sandbox Code Playgroud)
从我的孩子控制器:
def create
@child = Child.new(params[:parent])
respond_to do |format|
if @child.save
format.html { redirect_to(parent_path(params[:child][:parent_id]), :notice => 'Child was successfully created.') }
#This works as intended
format.xml { render :xml => @child, :status => :created, :location => @child }
else
format.html { redirect_to parent_path(params[:child][:patient_id]) }
#This redirects where I …Run Code Online (Sandbox Code Playgroud) For the situation where Employee has_many Clients, I am trying to write an ActiveRecord query that will return all of the Employees that have n or more clients. It's simple enough to write a join query to find all of the Employees with at least 1 client but extending my query to this more general case has left me stumped.
Edit - I should add that I'm trying to do this entirely at the database level. I want to …
我有一个非宁静的控制器,我正在尝试使用cancan授权!应用权限的方法.
我有一个像这样开始的delete_multiple动作
def delete_multiple
@invoices = apparent_user.invoices.find(params[:invoice_ids])
Run Code Online (Sandbox Code Playgroud)
我想在继续操作之前检查用户是否有权删除所有这些发票.如果我使用
authorize! :delete_multiple, @invoices
Run Code Online (Sandbox Code Playgroud)
许可被拒绝.我的能力.rb包括以下内容
if user.admin?
can :manage, :all
elsif user.approved_user?
can [:read, :update, :destroy, :delete_multiple], Invoice, :user_id => user.id
end
Run Code Online (Sandbox Code Playgroud)
是循环遍历我的数组并单独调用授权还是有更聪明的做事方式?我开始觉得做授权会比使用cancan用于复杂的非静态控制器更容易手动(尽管我的应用程序中有很多其他安静的控制器,它工作得很好).
我是一个相当新的测试,并有一个我想测试的UsersController.我从新行动开始,到目前为止有以下几点;
require 'spec_helper'
describe UsersController do
describe "GET 'new'" do
it "assigns a new User to @user" do
user = User.new
get :new
assigns(:user).should eq(user)
end
it "renders the :new template"
end
end
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的UsersController看起来像这样
class UsersController < ApplicationController
def new
@user = User.new
end
end
Run Code Online (Sandbox Code Playgroud)
我期待我的第一次测试工作,但是当我运行它时,我得到以下内容;
Failures:
1) UsersController GET 'new' assigns a new User to @user
Failure/Error: assigns(:user).should eq(user)
expected: #<User id: nil, email: nil, username: nil, password_digest: nil, created_at: nil, updated_at: nil>
got: #<User id: nil, email: nil, …Run Code Online (Sandbox Code Playgroud) 编辑 - 显然没有人知道这里有什么令我烦恼的事.我认为这只是一个问题,我在页面的其他地方做了一些阻止状态属性发送的事情.问题是我什么也看不见.我希望有人见过类似的东西,可以建议我需要看的地方.
我的页面上有一个虚拟表单,用于将数据发布到我的网络应用程序.它是在Rails中创建的(使用HAML)就像这样;
=form_tag bulk_invoice_path(''), method: 'put', class: 'mark-sent-form' do
=hidden_field_tag 'invoice[status]', 'Sent'
Run Code Online (Sandbox Code Playgroud)
这会生成以下html;
<form accept-charset="UTF-8" action="/bulk_invoices/" class="mark-sent-form" method="post">
<div style="margin:0;padding:0;display:inline">
<input name="utf8" type="hidden" value="✓" />
<input name="_method" type="hidden" value="put" />
<input name="authenticity_token" type="hidden" value="OU8GtbHycR/EJ+H3GG9MN59xI59v47LSaFc2wYZloAs=" />
</div>
<input id="invoice_status" name="invoice[status]" type="hidden" value="Sent" />
</form>
Run Code Online (Sandbox Code Playgroud)
在DOM中,这显示如下
<form accept-charset="UTF-8" action="/bulk_invoices/" class="mark-sent-form" method="post">
<div style="margin:0;padding:0;display:inline">
<input name="utf8" type="hidden" value="?">
<input name="_method" type="hidden" value="put">
<input name="authenticity_token" type="hidden" value="OU8GtbHycR/EJ+H3GG9MN59xI59v47LSaFc2wYZloAs=">
</div>
<input id="invoice_status" name="invoice[status]" type="hidden" value="Sent">
</form>
Run Code Online (Sandbox Code Playgroud)
这个表单是用jquery(使用coffeescript)发布的,就像这样;
jQuery ->
$('a.mark-sent').click -> updateBulkInvoices('.mark-sent-form')
updateBulkInvoices = …Run Code Online (Sandbox Code Playgroud)