标签: actioncontroller

Ruby On Rails的事务操作

我在控制器内部有一个复杂的动作,它对数据库执行几个更新查询.

如何在没有任何结构重构的情况下使此操作像事务一样

transactions ruby-on-rails actioncontroller

5
推荐指数
2
解决办法
3750
查看次数

如何在ActionController TestCase中禁用渲染视图(Rails 3.0.9)

什么是禁用ActionController :: TestCase实际呈现视图的正确方法?或者,在测试中没有布局的情况下渲染视图的方法是什么?

使用rr,我试过stub(@controller).render {""}

但这破坏了assert_template断言.

谢谢!

actioncontroller testcase ruby-on-rails-3

5
推荐指数
1
解决办法
1827
查看次数

仅转移struts'json中类的一部分属性

对不起,我真的不知道如何总结这个问题的标题.所以,标题可能不清楚.

我有一个执行一些业务逻辑的动作类.

在Action类中:

class ActionClass extends ActionSupport{
      private Merchandise merchandise;// I want to transfer it to the client
      //setter and getter

}
Run Code Online (Sandbox Code Playgroud)

在商品类中:

class Merchandise{
    private String name; // I want to transfer it
    private String price; //I don't want to transfer it
    private String description;//I don't want to transfer it
    //setter and getter
}
Run Code Online (Sandbox Code Playgroud)

现在,我需要将ActionClass中商品属性转移到客户端.

但是,在商品属性中,我只想传输name属性,同时禁止其他两个属性.

那么如何抑制商品类中其他两个属性(价格和描述)的转移?

json struts2 actioncontroller

5
推荐指数
1
解决办法
1433
查看次数

如何使用普通控制器测试来测试"捕获所有路线"?

注意:根据RafaeldeF.Ferreira的建议,这个问题自其原始形式以来经过大量编辑.

我的基于JSON的应用程序需要在给出错误路径时返回合理的内容.我们已经知道以下rescue_from ActionController::RoutingError在Rails 3.1和3.2中不起作用:

# file: app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery
  rescue_from ActionController::RoutingError, :with => :not_found
  ...
end
Run Code Online (Sandbox Code Playgroud)

(这在https://github.com/rails/rails/issues/671中有详细记载.)所以我实现了JoséValim在本博客条目(第3项)中描述的内容,详情如下.

但测试它一直存在问题.这个控制器rspec测试:

# file: spec/controllers/errors_controller.rb
require 'spec_helper'
require 'status_codes'
describe ErrorsController do
  it "returns not_found status" do
    get :not_found
    response.should be(StatusCodes::NOT_FOUND)
  end
end
Run Code Online (Sandbox Code Playgroud)

失败了:

ActionController::RoutingError: No route matches {:format=>"json", :controller=>"sites", :action=>"update"}
Run Code Online (Sandbox Code Playgroud)

然而,这个集成测试调用ErrorsController#not_found并成功:

# file: spec/requests/errors_spec.rb
require 'spec_helper'
require 'status_codes'

describe 'errors service' do
  before(:each) do
    @client = FactoryGirl.create(:client)
  end

  it "should catch routing error and …
Run Code Online (Sandbox Code Playgroud)

routing actioncontroller ruby-on-rails-3

5
推荐指数
0
解决办法
596
查看次数

当default_url_options trailing_slash为true时,Rails root_url有两个正斜杠

在application.rb文件中设置此行时:

config.action_controller.default_url_options = { trailing_slash: true}
Run Code Online (Sandbox Code Playgroud)

root_url包含两个正斜杠:

www.example.com//

没有那条线,我们得到:

www.example.com

我们有这个原因是SEO的目的,该网站是从PHP转换而来,我们希望保持一致性.

问题:有没有办法删除双正斜杠?它最近才开始这样做......也许是最近Rails的变化?(我们总是更新到最新的.)

更新:能够使用默认应用程序重现.(Rails 3.2.8)https://github.com/silasj/rails_test_forward_slash

Gihub问题:https://github.com/rails/rails/issues/8700

ruby-on-rails actioncontroller

5
推荐指数
1
解决办法
1212
查看次数

ActiveModel :: Serializer是否需要显式渲染调用?

我知道在使用视图模板(html,rabl)时,我不需要在我的控制器操作中进行显式渲染调用,因为默认情况下,Rails会使用与控制器操作名称对应的名称来呈现模板.我喜欢这个概念(不关心我的控制器代码中的渲染),因此想知道在使用ActiveModel :: Serializers时这是否可行?

例如,这是来自生成的控制器的代码(Rails 4.1.0):

class ProductsController < ApplicationController
  before_action :set_product, only: [:show, :edit, :update, :destroy]

  #other actions
  # GET /products/1
  # GET /products/1.json
  def show
  end
end
Run Code Online (Sandbox Code Playgroud)

这是序列化器:

class ProductSerializer < ActiveModel::Serializer
  attributes :id, :name, :description, :url, :quantity, :price
end
Run Code Online (Sandbox Code Playgroud)

点击/products/1.json,我希望有两件事情发生:

  1. 未列出序列化程序中未列出的字段,
  2. 要在"产品"顶级字段中封装的整个JSON对象.

但是,这不会发生,整个序列化器被忽略.但是,如果我将Show方法修改为以下内容:

# GET /products/1
# GET /products/1.json
def show
  @product = Product.find(params[:id])
  respond_to do |format|
    format.html
    format.json { render json: @product }
  end
end
Run Code Online (Sandbox Code Playgroud)

现在一切都很好,但我已经失去了before_action过滤器的好处(在我看来,我有一些冗余代码).

这应该怎么做?

actioncontroller active-model-serializers ruby-on-rails-4

5
推荐指数
1
解决办法
1240
查看次数

ActionController :: Metal需要什么模块才能将状态代码传递给渲染?

我有一个Api控制器使用ActionController :: Metal on Rails 4.1.6,如下所示:

class Api < ActionController::Metal
  include AbstractController::Rendering 
  include ActionController::ImplicitRender
  include ActionController::MimeResponds
  include ActionController::RequestForgeryProtection  
  include AbstractController::Callbacks
  include ActionController::HttpAuthentication::Token::ControllerMethods
  include ActionController::Head

  ...
end
Run Code Online (Sandbox Code Playgroud)

但是,如果我把它放在一个动作中

render 'not_found', status: 404

它正确呈现'not_found'模板但返回200状态代码.在ActionController :: Base中运行相同的渲染,它返回所需的404.我在这里缺少什么模块?

ruby-on-rails actioncontroller

5
推荐指数
1
解决办法
974
查看次数

Rails 控制器中 before_filters 的顺序和关注点

我有一个 Rails 问题定义如下:

module MyConcern
  extend ActiveSupport::Concern

  included do
    before_filter :filter_inside_concern
  end

  def filter_inside_concern
    # ...
  end
end
Run Code Online (Sandbox Code Playgroud)

before_filter在控制器层也有一个:

class MyController < ApplicationController
  before_filter :filter_inside_controller
end
Run Code Online (Sandbox Code Playgroud)

如果我包含MyConcerninside MyController,调用 before 过滤器的顺序是否取决于代码的排列方式?例如,如果我们有

class MyController < ApplicationController
  include MyConcern

  before_filter :filter_inside_controller
end
Run Code Online (Sandbox Code Playgroud)

filter_inside_concern之前是否被调用过filter_inside_controller(反之亦然)?

谢谢你!

ruby-on-rails before-filter actioncontroller ruby-on-rails-4 activesupport-concern

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

如何检查rails请求参数中是否有文件字段

我正在制作一个日志系统,用于跟踪网络服务器收到的所有请求。如何检查任何请求是否包含任何文件,即任何文件上传操作?

file-upload ruby-on-rails request actioncontroller

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

Rails:将局部变量从控制器传递到视图

我试图将局部变量从控制器传递到视图:

# pages_controller.rb
def my_method
  render template: "pages/new_page", message: @message
end

# new_page.html.erb
<% if message %>
  Do something
<% else %>
  Do something else
<% end %>
Run Code Online (Sandbox Code Playgroud)

但这给了我未定义的局部变量或方法message错误,而在部分情况下这可以正常工作。

我知道这可以这样解决:

def my_method
  render template: "pages/new_page", locals: { message: @message }
end
Run Code Online (Sandbox Code Playgroud)

我只是想知道,在没有当地人的情况下,这是如何工作的。

ruby-on-rails local-variables actionview partials actioncontroller

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