小编bra*_*rad的帖子

:除了不在应用程序控制器中的before_filter中工作.路由问题?

我的应用程序控制器中有一个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)

routing ruby-on-rails before-filter

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

为什么我需要使用.inject(0)而不是.inject才能使这个工作?

我正在创建一个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吗?如果是这样,为什么它现在有用?如果没有,那么为什么它不起作用.

ruby ruby-on-rails inject

11
推荐指数
2
解决办法
7995
查看次数

如何在Rails中为我的控制器和模型提供方法?

我在我的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的新见解.我猜测一个模块或混合是答案,但我到目前为止还没有真正使用其中任何一个,需要一点手握.

谢谢.

ruby oop ruby-on-rails

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

如何找到同时拥有猫狗的用户?

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

这将是我的应用程序的方式.

sql activerecord ruby-on-rails ruby-on-rails-3

10
推荐指数
2
解决办法
2211
查看次数

如何将字符串与第一个逗号(如果存在)与Ruby regexp匹配

我正在努力获得一个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)

关闭但没有雪茄.有人可以帮忙吗?

ruby regex

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

如何将验证错误消息传递给另一个控制器中的方法?

我刚刚开始使用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)

ruby-on-rails

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

How do I select all records with more than n child records

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 …

activerecord ruby-on-rails

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

如何使用cancan来授权一系列资源?

我有一个非宁静的控制器,我正在尝试使用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用于复杂的非静态控制器更容易手动(尽管我的应用程序中有很多其他安静的控制器,它工作得很好).

authorization ruby-on-rails cancan

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

如何使用rspec在我的控制器的新操作中测试实例变量的赋值?

我是一个相当新的测试,并有一个我想测试的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)

ruby testing rspec ruby-on-rails ruby-on-rails-3

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

为什么我不能在名称中发布带有'status'的表单字段?

编辑 - 显然没有人知道这里有什么令我烦恼的事.我认为这只是一个问题,我在页面的其他地方做了一些阻止状态属性发送的事情.问题是我什么也看不见.我希望有人见过类似的东西,可以建议我需要看的地方.


我的页面上有一个虚拟表单,用于将数据发布到我的网络应用程序.它是在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="&#x2713;" />
    <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)

browser forms parameters ruby-on-rails

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