一芥备、讀書筆記
2.2 Ruby的一些基礎(chǔ)知識
- 先舉個Ruby函數(shù)的例子:
def say_goodnight(name)
result = "Good night, " + name
return result
end
puts say_goodnight('john')
puts say_goodnight('link')
result不用聲明,被賦值的時候便存在了媒惕。
puts say_goodnight('john')
是含有兩個方法独令,say_goodnight('john')這個方法的參數(shù)傳給puts,puts是顯示函數(shù)
還有另外一種寫法是一樣的道理:
puts(say_goodnight('john'))
- Ruby對單引號處理的少愕秫,對單引號字符串有更多的處理,首先焰络,他尋找以反斜杠開始的序列戴甩,并用二進制替換他們,其中最常見的是\n舔琅,他會被回車符替換掉等恐。舉個例子:
puts "good night,\n grandama"
輸出:
good night,
grandama
- Ruby對雙引號字符串做的第二件事情是,表達式內(nèi)插(expression interinterpolation)备蚓,#{表達式}序列會被“表達式”的值替換课蔬,可以用這種方式重寫前面的方法。
def say_goodnight(name)
result = "Good night, #{name}"
return result
end
puts say_goodnight('john')
puts say_goodnight('link')
- Ruby構(gòu)建這個字符串對象時郊尝,它找到name的當前值并把它替換到字符串中二跋,任意復雜的表達式都允許放在#{...}結(jié)構(gòu)中,覺個例子:
def say_goodnight(name)
result = "Good night, #{name.capitalize}"
return result
end
puts say_goodnight('uncle')
結(jié)果:
good night流昏,Uncle
- 如果表達式是一個全局實例或類變量扎即,則不需要提供花括號。
$greet = "Hello" # $greet是全局變量
@name = "Produce" # @name是實例變量
puts "#$greet, #$name"
- 其實况凉,可以進一步簡化谚鄙,把臨時變量和return語句拿掉
def say_goodnight(name)
"Good night, #{name.capitalize}"
end
puts say_goodnight('uncle')
結(jié)果是一樣的
- 總結(jié):
全局變量用美元符號($),實例變量用(@)刁绒,類變量用兩個“at”(@@)闷营,最后,類常量知市、模塊名和常量傻盟,都必須以一個大寫字母開始。
2.3 數(shù)組和散列表
- Ruby的數(shù)組和散列表(hashes)是被索引的收集(indexed collection)嫂丙,兩者都存儲對象的集合娘赴,通過鍵(key)來訪問。
- 數(shù)組鍵只能是整數(shù)跟啤,散列可以是任意對象诽表。
2.4 控制結(jié)構(gòu)
- Ruby具有所有常見的控制結(jié)構(gòu),如if語句和while循環(huán)語句
- 語句修飾符
if dog > 10
puts "danger, run away!"
end
可以改成這樣:
puts "danger, run away!" if dog > 10
while循環(huán)語句也是如此
2.5 正則表達式
- 《精通正則表達式》
- 正則表達式是對象并且可以當做對象來操作
- 什么是模式(pattern)隅肥,句個例子:
/perl|ython/
他會匹配perl或Python的字符串
前面那個斜線界定了模式关顷,模式由要匹配的兩個字符串組成,它們被管道符(|)分開武福,管道符的意思就是要么左邊,要么右邊痘番。 - 可以在模式中使用括號:
/p(erl|ython)/
- 也可以在模式中指定重復(repettion)捉片,/ab+c/匹配了一個含有a平痰,后面跟著一個或多個b,其后是c的字符串伍纫,把模式中的加號改成星號宗雇,/ab*c/創(chuàng)建了一個匹配含有a,零個或者多個b然后是c的表達式莹规,
- 也可以在模式中一組或多組字符赔蒲,一些常見的字符類(character classes),如\s良漱,它匹配空白字符(空格符舞虱,制表符,回車換行符等等)母市;\d矾兜,匹配任何數(shù)字;\w患久,匹配會出現(xiàn)在一個詞內(nèi)的任何字符椅寺。一個點(.)匹配幾乎任意字符。
可以用它們產(chǎn)生一些有用的表達式:
/\d\d:\d\d:\d\d/ # 時間 12:34:12
/Perl.*Python/ # Perl蒋失,零個或多個別的字符返帕,然后是Python
/Perl Python/ # Perl,一個空格和Python
/Perl *Python/ # Perl篙挽,零個或多個空格荆萤,和Python
/Perl +Python/ # Perl,一個或多個空格嫉髓,和Python
/Perl\s+Python/ # Perl观腊,空格字符,然后是Python
二算行、心得體會
今天的收獲梧油?一大堆rails函數(shù)
- super 表示調(diào)用父類的同名函數(shù),并將本函數(shù)的所有參數(shù)傳入父類的同名函數(shù)州邢;
- split 把對象以某種格式分割成一個數(shù)組
- singularize 復數(shù)變成單數(shù)
- remove 以某種格式去掉對象中的元素或者轉(zhuǎn)換對象中的元素位置
- try 這個整不明白儡陨??
- ActionController::Parameters 動作控制器參數(shù)
為了防止暴露不應暴露的屬性量淌,有要求(require)和許可(permit)兩種方法骗村,前者用
于根據(jù)需要標記參數(shù),后者用于按照允許的方式設(shè)置參數(shù)呀枢,并限制允許批量更新的屬性胚股。
我對代碼的理解:
class Admin::ApplicationController < ApplicationController # Admin::Application繼承父類Application
before_action :top_module_for_namespace #在執(zhí)行這個文件的下面這些代碼之前,先執(zhí)行這行代碼裙秋,獲取頂級module
before_action :sign_in_required #登陸
before_action :permission_required #權(quán)限驗證
before_action :create_log #建立日志
def model
self.class.name.remove(/^Admin|Controller$/).singularize.safe_constantize #去掉類名中的Admin和controller琅拌,變成單數(shù)缨伊,返回
end
def top_module_for_namespace
self.class.name.split('::').second.safe_constantize #這個類本身的名稱以'::'分割成一個數(shù)組,并且第取出二個值
end
def sign_in_required
return if current_user #如果用戶已經(jīng)登陸的話进宝,則返回.....刻坊,否則提示無權(quán)限,并跳轉(zhuǎn)到登陸頁
respond_to do |format|
format.html { render template: 'admin/application/sign_in', layout: false }
format.json { render json: {}, status: :unauthorized }
end
end
def crud
@record ||= model.find(params[:id]) if params[:id] #如果@record沒有值的話党晋,就把后面的一大串賦值給它
@record ||= model.new # 新建一個記錄
@record = model.new(ActionController::Parameters.new(@record.attributes).permit(*model.admin_fields)) if @record.try(:id) && params[:action] == 'new' && params[:id].present?
#動作控制器參數(shù)
@record.attributes = param.permit(*model.admin_fields) #attributes
@saved = @record.save if !request.get? && model.admin_fields.present?
respond_with_record
end
end