over 4 years ago

下面這個LINK會藉由網址傳:board_id的值給controller

<%= link_to("+New Topic", new_account_topic_path(@board, :board_id => @board.id), :class => "btn btn-mini btn-success" ) %>

所以網址會長得像這樣:
www.example.com/new?board_id=value

這樣就可以在action中運用這個值

這次的實作方法是把值傳給new action, 並在form中給一個hidden field藏這個值,讓他可以跟form一起吐給create action

5/10補充

過幾天後發現這樣的做法有一個問題
link傳值給new後,倘若使用者輸入格式驗證錯誤,通常我們會在controller內讓使用者render new page,但是這樣做render的頁面就不會有當初傳給new的值(在此例為board_id)
解法如下:

account/topic_controller.rb
  def new
    @topic = current_user.topics.new
    @board = params[:board_id]
  end

  def create
    @topic = current_user.topics.new(topic_params)
    @board = topic_params[:board_id]
    if @topic.save
      redirect_to board_topic_path(@topic.board_id, @topic)
      flash[:success] = "create success!"
    else
      flash[:warning] = "create failed"
      render :new, board_id: @board     #這裡可以改寫成 render :new

    end
  end
_form.html.erb
<%= simple_form_for [:account, @topic] do |f|  %>
  <%= f.input :title, :required => true %>
  <%= f.input :content, :required => true %>
  <%= f.input :avatar, :label => "Image" %>
  <%= f.input :board_id, :as => :hidden, :input_html => {:value => @board} %>
  <%= f.submit "Submit", :disable_with => "Submiting..." %>
<% end %>

首先讓form hidden field的value部分吃@board這個變數
然後再new action和create action內都定義這個區域變數
其中create action因為要從form傳出來的資料取值,所以必須從strong_params內拿board_id,要寫成

@board = topic_params[:board_id]

這樣即使render過後我們的form也會知道board_id是什麼囉~oh ya!

補充一個有趣的事情

原本我create action內是這樣寫的:

render :new, board_id: @board

但是後來我發現其實這樣寫也可以:

render :new

原因似乎是因為render :new的時候他並不是真的重新執行一次new action
而是把已經建立過的new action存成一個object(應該是吧?),然後直接render這個曾經執行過的object
所以指定board_id: @board是沒有意義的,render後的form吃的@board是在create action下定義的@board
有趣有趣!

← git-ignore 網頁開發Road Map →
 
comments powered by Disqus