我在控制器内部有一个复杂的动作,它对数据库执行几个更新查询.
如何在没有任何结构重构的情况下使此操作像事务一样?
什么是禁用ActionController :: TestCase实际呈现视图的正确方法?或者,在测试中没有布局的情况下渲染视图的方法是什么?
使用rr,我试过stub(@controller).render {""}
但这破坏了assert_template断言.
谢谢!
对不起,我真的不知道如何总结这个问题的标题.所以,标题可能不清楚.
我有一个执行一些业务逻辑的动作类.
在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属性,同时禁止其他两个属性.
那么如何抑制商品类中其他两个属性(价格和描述)的转移?
注意:根据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) 在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
我知道在使用视图模板(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,我希望有两件事情发生:
但是,这不会发生,整个序列化器被忽略.但是,如果我将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过滤器的好处(在我看来,我有一些冗余代码).
这应该怎么做?
我有一个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.我在这里缺少什么模块?
我有一个 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)
如果我包含MyConcern
inside 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
我正在制作一个日志系统,用于跟踪网络服务器收到的所有请求。如何检查任何请求是否包含任何文件,即任何文件上传操作?
我试图将局部变量从控制器传递到视图:
# 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
actioncontroller ×10
actionview ×1
file-upload ×1
json ×1
partials ×1
request ×1
routing ×1
struts2 ×1
testcase ×1
transactions ×1