2013-06-04 196 views
3

在Rails 4上,我無法從控制器的URL中獲取參數。Ruby on Rails:從網址獲取參數

我有兩個has_many和belongs_to關聯的模型,我們稱它們爲Books和Pages。我想創建一個新的頁面記錄,並將其鏈接到Book模型,具體取決於用戶點擊「創建」按鈕時用戶訪問的是哪本書(例如,如果用戶在侏羅紀公園的書頁上並單擊「創建, 「我想創建一個與侏羅紀公園書有關的新頁面)。

這裏是我的觀點的創建鏈接:

<%= link_to "Create page", new_page_path(:book => @book.id), :id => "submit-button" %> 

這裏是我的控制器:

def new 
    @page = Page.new 
end 

def create 
    @book = Book.find(params[:book]) 
    @page = Product.new(page_params) 
    @page.book_id = @book.id 
    if @page.save 
    flash[:success] = "Page Submitted!" 
    redirect_to @book 
    else 
    render 'new' 
    end 
end 

我收到以下錯誤:

"ActiveRecord::RecordNotFound in PagesController#create - Couldn't find Book without an ID"

我是完全這樣做錯誤?我知道Rails 4改變了params的工作方式,這與獲取URL參數的語法是一樣的,所以也許這就是導致這個問題的原因。

編輯:我也嘗試從'新'作爲變量獲得params,然後使用它作爲id,但我得到相同的錯誤消息。

+0

嗨。在Rails4中,strong_parameters是默認值。所以你應該允許你從網址或表單中獲得每個參數。在你的情況下,你應該有一個'book_params',這個book_params可以和find一起使用。 – Zoltan

+0

'@book = Book.find(book_params)' 下'private'在控制器 '高清book_params PARAMS [:書] .permit(:身份證,:名稱) end' – Zoltan

回答

0

new_page_path將在這裏調用GET的「新」操作。它不會像你期望的那樣調用「創建」動作。理想情況下,您想調用「創建」操作。試試這個:

button_to 'Create Page', pages_path(:book => @book.id), :method => :post 

link_to通常應該只指向GET操作。對於這樣的事情,最好是使用button_to。

0

我認爲你正在尋找(注:代替ID:書):

<%= link_to "Create page", new_page_path(:id => @book.id), :id => "submit-button" %> 

然後更新您的創建方法:

def create 
    @book = Book.find(params[:id]) 
    ... 
end