controller的约定

#继承体系
class ApplicationController < ActionController::Base  #application_controller.rb中约定
class UsersController < ApplicationController #普通controller是复数形式

#使用命令行形式,controller是复数,model是单数
rails g controller users new index #controller是复数
rails g controller SiteAdminsController #驼峰形式,最后一个单词为复数,优于SiteAdminController和SitesAdminsController
rails g model user name address #model是单数

controller中的参数

#参数来源包括四种,第一种是url中参数来源,第二种是表单中的参数来源,第三种是路由中参数,第四中default_url_options方法定义

#url中参数来源1:值为单个值
url:http://localhost:3000/clients?status=activated
def index
  if params[:status] == "activated"
    @clients = Client.activated
  else
    @clients = Client.inactivated
  end
end

#url中参数来源2:值为多个值
url: GET /clients?ids[]=1&ids[]=2&ids[]=3
params[:ids]为["1", "2", "3"]


#表单中的参数来源
#view中数据
form_for :client do |f|
  f.text_field :name
  f.submit
end
#controller中数据
def create
  @client = Client.new(params[:client])
  if @client.save
    redirect_to @client
  else
    render "new"
  end
end

#设置参数路由1,可以获得params[:foo]的值为"bar"
Rails.application.routes.draw do
  get 'welcomes/index', to: "welcomes#index", foo: "bar"
end
#设置参数路由2, /articles/17, 可以获得params[:id]的值为17,若/articles/bar, 可以获得params[:id]的值为bar
Rails.application.routes.draw do
  get '/articles/:id', to: "articles#show", as: 'article'
end



#通过default_url_options, k
class ApplicationController < ActionController::Base
  def default_url_options
    { locale: I18n.locale }
  end
end

strong parameters

#一般格式
class PeopleController < ActionController::Base
  def create
    Person.create(person_params)
  end

  private
    def person_params
      #默认id是被允许的,不用传递进permit
      params.require(:person).permit(:name, :age)
    end
end

#传递必须为标量(单个值),如果需要传递数组和hash,必须将其设置为空
params.require(:person).permit({ article_id: [] }, name: {}, :age)

#把属性全部传递进去
params.require(:person).permit!

#accepts_nested_attributes_for的例子

session

#默认采用CookieStore的方式来来存储session,如果需要改变,在config/initializers中设置文件,内容如下
Rails.application.config.session_store :cookie_store, key: '_your_app_session'

#config/secrets.yml文件中,存在secret_key_base
通过secret_key_base和browser中的cookies,可以获得session_id和_csrf_token

#session的获取,和hash的获取方式一致
session[:user_id] = @current_user.id  #session的命名
session[:user_id] #session的获取
session[:user_id] = nil #把session值删除的方式

flash

#是session的特殊部分,只在下一次的request中有效,其中redirect_to是下次request, render是本次request

#一般用法
def destroy
  session[:current_user_id] = nil
  flash[:notice] = "You have successfully logged out."
  #替代用法
  #redirect_to root_url, notice: "You have successfully logged out."
  #redirect_to root_url, flash: { notice: "You have successfully logged out." }
  redirect_to root_url #这是下一次request,在root_url中有效
end

#非常规用法:在下下一次request中有效,使用flash.keep(:notice)
#下面的代码中,上一个flash本来这边起作用,保存这个flash,到users_url中起作用
def index
  flash.keep
  # 替代用法
  # flash.keep(:notice)
  redirect_to users_url
end

#非常规用法:在本次request中起作用,使用flash.now(:notice)
def create
  @client = Client.new(params[:client])
  if @client.save
    # ...
  else
    flash.now[:error] = "Could not save client"
    render action: "new"
  end
end

cookie

#将数据存储在客户端,多次请求时候可以访问

#可以选择多种方式将cookie进行序列化,默认在config/initializers/cookies_serializer.rb中
#因为在序列化和反序列化的过程中会出错,因此建议cookie中只存储简单的数字,包括字符串和数字
Rails.application.config.action_dispatch.cookies_serializer = :json #可以指定多种,比如 :bybird

#一般用法,
cookies[:commenter_name] = @comment.author  #命名
cookies[:commenter_name] #获取
cookies.delete(:commenter_name) #删除

#加密用法
cookies.encrypted[:expiration_date] = Date.tomorrow
cookies.encrypted[:expiration_date]

session和cookie的区别

#存储方式
session可以选择多种存储方式,默认使用CookieStore, cookie就是存储在客户端中

#加密
在browser中,session是加密处理的,一般的cookie是明文传输的,只有cookie.encrypted才是加密处理,通过secret_key_base可取获取加密的值

results matching ""

    No results matching ""