在index這頁最下方加了一個 Add post的link,連到new這頁來新增資料
<%= link_to 'Add post', :controller => 'guests', :action => 'new' %>
首先要在guests_controller的 new action新增一個實例物件guest,繼承Guest這個class
def new
@guest = Guest.new
end
接著在new.html.erb這個view上我們要新增一個表單來傳送user輸入的資料
<%= form_for @guest, :url => {:controller => 'guests', :action => 'create' } do |f| %>
<%= f.label :title, "Title" %>
<%= f.text_field :title %>
<%= f.label :description, "Description" %>
<%= f.text_area :description %>
<%= f.submit "Create" %>
<% end %>
這邊form_for這個區塊會建立一個html表單綁定剛剛我們新建立的@guest物件,但這個表單只能基於這個Model有的屬性(在這個例子是title跟description)。
Rails偏好使用form_for而不是讓你手寫表單HTML,這是因為程式碼可以更加簡潔,而且可以明確地連結在Model物件上。 ---實戰聖經
當user點擊create時,瀏覽器就會將這個表單傳送至guests_controller的create action
我們在create action一樣new一個實例物件@guest來裝這個表單,並儲存之後將頁面轉回至index
def create
@guest = Guest.new(params[:guest])
@guest.save
redirect_to :action => :index
end
//以上是聖經的寫法,但我執行會出現ActiveModel::ForbiddenAttributesError這個錯誤
後來在stackoverflow找到的解法是要另外寫一個function來接這個params hash
然後再丟進去Guest這個物件裡:
將
@guest = Guest.new(params[:guest])
這行改成
@guest = Guest.new(guests_params)
並加入
private
def guests_params
params.require(:guest).permit(:title, :description)
end