Agile Web Development with Rails 3nd Edition 閱讀筆記
1.session 使用
1)如何使用數(shù)據(jù)庫保存session,以增加session的安全性?
> rake db:sessions:create 創(chuàng)建Session相關(guān)的表結(jié)構(gòu)
> rake db:migrate 在數(shù)據(jù)庫中創(chuàng)建表
修改 environment.rb 中使用database來代替默認(rèn)采用基于cookie的存儲(chǔ)方式.
# Use the database for sessions instead of the cookie-based default,
# which shouldn't be used to store highly confidential information
# (create the session table with 'rake db:sessions:create')
config.action_controller.session_store = :active_record_store
然后在基類application.rb中加入
session :session_key => '_session_id' #(存入cookie的ID)
# See ActionController::RequestForgeryProtection for details
# Uncomment the :secret if you're not using the cookie session store
protect_from_forgery :secret => '8c3e099237e6366fd2f5366e9c430e79' #(加密字符串,換個(gè)自己的吧)
簡單一個(gè)session應(yīng)用實(shí)例(找下session是否存在cart,不存在就創(chuàng)建一個(gè)新的扔進(jìn)去)
def find_cart
unless session[:cart]
session[:cart] = Cart.new
end
session[:cart]
end
上面亂七八糟的代碼可以簡寫成 session[:cart] ||= Cart.new
2.使用<%= render(:partial => "cart_item" , :collection => @cart.items) %>可以引入一個(gè)control,其中對(duì)應(yīng)的control的文件名為"_cart_item.html.erb,在片段中引用的變量為"cart_item".在書中的實(shí)例如下:
depot/app/views/store/add_to_cart.html.erb
[CODE]
<div class="cart-title">Your Cart</div>
<table>
<%= render(:partial => "cart_item" , :collection => @cart.items) %>
<tr class="total-line">
<td colspan="2">Total</td>
<td class="total-cell"><%= number_to_currency(@cart.total_price) %></td>
</tr>
</table>
<%= button_to "Empty cart" , :action => :empty_cart %>
[CODE]
[CODE]
depot/app/views/store/_cart_item.html.erb
<tr>
<td><%= cart_item.quantity %>×</td>
<td><%=h cart_item.title %></td>
<td class="item-price"><%= number_to_currency(cart_item.price) %></td>
</tr>
[CODE]
上面使用的是一個(gè)循環(huán)調(diào)用某個(gè)control,可以只傳入一個(gè)Object
<%= render(:partial => "cart" , :object => @cart) %>
3.如何使用Ajax
先使用<%= javascript_include_tag :defaults %> 引入默認(rèn)的Javascript
然后使用
<% form_remote_tag :url => { :action => :add_to_cart, :id => product } do %>
<%= submit_tag "Add to Cart" %>
<% end %>
使用ajax觸發(fā)動(dòng)作.
一個(gè)簡單的Helper類里面定義方法的使用:
def hidden_div_if(condition, attributes = {}, &block)
if condition
attributes["style" ] = "display: none"
end
content_tag("div" , attributes, &block)
end
在頁面上使用
<% hidden_div_if(@cart.items.empty?, :id => "cart" ) do %>
<%= render(:partial => "cart" , :object => @cart) %>
<% end %>
來引用.