`
bellstar
  • 浏览: 150650 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

rails控制器学习笔记

阅读更多
教程原文http://guides.rubyonrails.org/action_controller_overview.html
.Array参数
Get /clients?ids[]=1&id[]=2&id[]=3
params[:ids]=["1", "2", "3"]

.Hash参数
<form action="/clients" method="post">  
	<input type="text" name="client[name]" value="Acme" />  
	<input type="text" name="client[phone]" value="12345" />  
	<input type="text" name="client[address][postcode]" value="12345" />  
	<input type="text" name="client[address][city]" value="Carrot City" /> 
</form> 

params[:client] => {"name" => “Acme”, “phone” => “12345”, “address” => {"postcode" => “12345”, “city” => “Carrot City”}}

.路由参数
map.connect "/clients/:status", 
	:controller => "clients", 
	:action => "index",
	:foo => "bar"

params[:foo] => "bar"


.Session
Session存储策略
1、CookieStore:在客户端存储任何东西
2、DRBStore:在DRb服务器上存储数据
3、MemCacheStore:在MemCacheStore上存储数据
4、ActiveRecordStore:在数据里存储数据

.Flash
flash是一种特殊的Session,仅可在下一次请求中访问,且在下一次请求完成后清除。
如果你想继续保持flash的值到下一次,flash.keep

让当前请求访问可flash,flash.now
class ClientsController < ApplicationController 
	def create 
		@client = Client.new(params[:client])  
		if @client.save # ...  
		else  
			flash.now[:error] = "Could not save client"  
		render :action => "new"  
		end  
	end 
end 


.Cookie
#设置
cookies[:commenter_name] = @comment.name
#删除项
cookies.delete(:commenter_name)
#注意设置cookies[:commenter_name] = nil并不会删除cookies[:commenter_name]


.Filters
class ApplicationController < ActionController::Base
	before_filter :require_login 

 private 
	def require_login 
		unless logged_in? 
			flash[:error] = "You must be logged in to access this section"  
			redirect_to new_login_url # halts request cycle  
		end  
	end  
	
	# The logged_in? method simply returns true if the user is logged  
	# in and false otherwise. It does this by "booleanizing" the  
	# current_user method we created previously using a double ! operator.  
	# Note that this is not common in Ruby and is discouraged unless you  
	# really mean to convert something into true or false.  
	def logged_in? 
		!!current_user 
	end 
end 

跳过filter
class LoginsController < ApplicationController
	skip_before_filter :require_login, :only => [:new, :create]
end


after_filter:action调用之后执行
around_filter:action调用前后都执行

.参数检查
class LoginsController < ApplicationController
	#所有action验证参数
	verify :params => [:username, :password],
		:render => {:action => "new"}, #检验错误时渲染action
		:add_flash => {
			:error => "Username and password required to login in"
		}
		#如果仅是create要验证,开启下两行
		#,
		#:only => :create 

	def create
		@user = User.authenticate(params[:username], params[:password])
		if @user
			flash[:notice] = "You're logged in"
			redirect_to root_url
		else
			render :action => "new"
		end
	end
end


.请求保护

.Request和Response对象
自定义header
response.headers["Content-Type"] = "application/pdf"


.HTTP认证
Basic Authentication基本认证
Digest Authentication摘要式身份验证
Digest Authentication可以避免以明文传输数据
class AdminController < ApplicationController
	USERS = { "lifo" => "world" }
	
	before_filter :authenticate

private
	def authenticate
		authenticate_or_require_with_http_digest do |username|
			USERS[username]
		end
	end
end

返回false或nil会中断认证

.Streaming和文件下载
生成pdf
require "prawn" 
class ClientsController < ApplicationController 
# Generates a PDF document with information on the client and  
# returns it. The user will get the PDF as a file download.  
def download_pdf 
	client = Client.find(params[:id])  
		send_data(generate_pdf,  :filename => "#{client.name}.pdf",  :type => "application/pdf")  
	end 

private 
	def generate_pdf(client)  
		Prawn::Document.new do  
			text client.name, :align => :center  
			text "Address: #{client.address}"  
			text "Email: #{client.email}"  
		end.render 
	end

end 


下载服务器已有的文件
class ClientsController < ApplicationController 
	# Stream a file that has already been generated and stored on disk.  
	def download_pdf client = Client.find(params[:id])  
		send_data("#{RAILS_ROOT}/files/clients/#{client.id}.pdf",  
			:filename => "#{client.name}.pdf",  
			:type => "application/pdf")  
	end 
end 


RESTful下载
class ClientsController < ApplicationController 
	def show
		@client = Client.find(params[:id])
		
		respond_to do |format|
			format.html
			format.pdf { render :pdf => generate_pdf(@client) }
		end
	end
end


添加下面的代码到config/initializers/mime_types.rb
Miem::Type.register "application/pdf", :pdf


url:GET /clients/1.pdf


日志过滤
避免key包含password的参数记录到log
class ApplicationController < ActionController::Base
	filter_parameter_logging :password
end



错误处理

rescue_from
处理记录未找到错误
class ApplicationController < ActionController::Base 
	rescue_from ActiveRecord::RecordNotFound, 
			:with => :record_not_found private 
	def record_not_found 
		render :text => "404 Not Found", 
			:status => 404 
	end 
end 

处理未通过验证错误
class ApplicationController < ActionController::Base
  rescue_from User::NotAuthorized, :with => :user_not_authorized

private
  def user_not_authorized
    flash[:error] = "You don't have access to this section."
    redirect_to :back
  end
end

class ClientsController < ApplicationController
  # Check that the user has the right authorization to access clients.
  before_filter :check_authorization

  # Note how the actions don't have to worry about all the auth stuff.
  def edit
    @client = Client.find(params[:id])
  end

private
  # If the user is not authorized, just throw the exception.
  def check_authorization
    raise User::NotAuthorized unless current_user.admin?
  end
end
分享到:
评论

相关推荐

    rails查询学习笔记

    Ruby on Rails,简称Rails,是一款基于Ruby语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,使得开发Web应用更加高效便捷。在Rails中,数据库查询主要通过ActiveRecord来实现,这是一个强大的...

    Ruby_On_Rails笔记

    Ruby on Rails是一个使用Ruby语言编写的开源Web应用框架,它使用了“约定优于配置”(convention...通过对这些知识点的学习,初学者可以快速了解Rails的安装、项目结构、MVC架构的基本概念以及如何编写控制器和视图等。

    rails_入门详细笔记(官网翻译).

    ### Rails 入门详细笔记知识点解析 #### 一、环境搭建 在开始使用 Rails 进行开发之前,...接下来可以进一步深入学习控制器、模型、视图等核心概念,探索更多高级特性,如 ActiveRecord 模型、数据库迁移、测试等。

    ruby on rails 笔记(陈刚)

    从给定的文件信息来看,这份文档是陈刚关于Ruby on Rails的学习笔记,旨在帮助初学者更好地理解并掌握Ruby on Rails这一流行的Web开发框架。以下是对文档中提及的关键知识点的详细解析: ### 安装与配置 #### Ruby...

    Ruby_on_Rails笔记

    在《Ruby on Rails笔记》中,作者陈刚分享了他在学习Ruby on Rails过程中的经验与心得。这份笔记不仅包含了作者的学习历程和个人体会,还汇集了他在学习过程中遇到的问题及其解决方案。作者提到,“读不如做,做不如...

    web敏捷开发rails笔记

    通过以上内容的学习,我们了解了Rails的基本环境搭建、应用创建、控制器与视图的关系、动态内容的展示方式以及敏捷开发的思想。Rails以其高效简洁的特点,成为了Web开发领域的重要工具之一。掌握Rails不仅能够提高...

    ruby on rails 实践

    Ruby on Rails是一种流行的开源网站开发框架,它利用Ruby语言,遵循MVC(模型-视图-控制器)设计原则,用于快速开发数据库驱动的动态网站。本书《Ruby on Rails 实践》是一本指南,旨在向读者介绍Ruby on Rails框架...

    ROR 学习笔记系列一 Windows XP下环境安装配置(2)

    在本篇ROR(Ruby on Rails)学习笔记中,我们将深入探讨如何在Windows XP操作系统上进行环境的安装和配置。Ruby on Rails是一个流行的开源Web应用框架,它基于Ruby编程语言,以其“DRY”(Don't Repeat Yourself)...

    Ruby on Rails心得

    陈刚撰写的《Ruby on Rails心得_V0.1》是一份非常宝贵的资料,旨在记录作者在学习Ruby on Rails过程中的所见所得,包括读书笔记、心得体会、自创教程及一些常见问题的解决方案。作者通过写作这种方式不仅加深了对...

    rubyinstaller-devkit-3.0.2-1-x64 and Ruby 学习笔记.7z

    Ruby on Rails(简称Rails)是基于Ruby构建的一个Web开发框架,它遵循MVC(模型-视图-控制器)架构模式。Rails强调DRY(Don't Repeat Yourself)原则,提供了丰富的工具和约定,使得开发者能够高效地创建功能丰富的...

    后端语言的学习笔记.zip

    "后端语言的学习笔记.zip"这个压缩包很可能包含了关于各种后端编程语言的学习资源,特别是那些用于构建动态网站和Web服务的语言。尽管没有具体的标签提供额外信息,我们可以推测这可能涵盖了诸如Java、Python、Node....

    Ruby-on-Rails-101:Ruby on Rails 笔记摘自 WDI HKV 和其他来源。 比如,lynda的在线Rails教程

    - **Routes**:Rails的路由系统负责将URL映射到相应的控制器和动作,实现URL与应用逻辑的关联。 ### 2. **安装与设置** - **Ruby安装**:首先确保系统中安装了Ruby,Rails依赖于特定版本的Ruby,可以使用RVM或rbenv...

    Agile Web Development with Rails 3nd 下载

    在描述中提到的“NULL”可能意味着该资源没有提供详细的介绍,但通过博文链接(https://hlee.iteye.com/blog/351357),我们可以推测这是一个关于学习和实践Rails 3的博客文章,可能包含了作者的学习笔记、示例代码...

    Rail笔记

    在Rails中,每个控制器都对应一组特定的URL,处理相应的HTTP请求。创建控制器的过程涉及编辑控制器类和对应的视图文件。例如,创建`HelloWorldController`,并在其中定义`say`方法,用于向用户展示信息。`@word`变量...

    padrino-note:基于 Sinatra 的 Padrino Web 框架学习笔记

    Study notes for Padrino web framework英文名:Study notes for Padrino web framework中文名:Padrino学习笔记简介在使用Ruby语言的Web开发框架中,Rails和Sinatra是最流行的两个。由于Sinatra只提供了Web开发最...

    我的ror的第一天

    压缩包中的文件"ror.txt"可能是作者记录的详细安装过程或者学习笔记,可能包含了遇到的问题、解决方法以及个人心得。 在学习Rails的过程中,理解其核心概念,如MVC架构、路由规则、ActiveRecord模型、 erb模板引擎...

    tdd-rails-pluralsight:使用RSpec,Capybara和Cucumber以及Pluralsight课程学习Rails的TDD

    存根和依赖注入无轨演示测试其他情况测试电子邮件测试文件上传测试第三方API 测试您自己的API 试驾完整功能功能规格激励控制器创造鼓励画龙点睛 具有RSpec,Capybara和Cucumber的测试驱动Rails 我在TDD Rails上的...

Global site tag (gtag.js) - Google Analytics