3

在 Rails 4 上,我无法从控制器中的 URL 获取参数。

我有两个具有 has_many 和 belongs_to 关联的模型,我们称它们为 Books 和 Pages。我想创建一个新的页面记录并将其链接到图书模型,具体取决于用户单击“创建”按钮时正在访问的图书(即,如果用户在侏罗纪公园图书页面上并单击“创建, “我想创建一个与侏罗纪公园图书相关联的新页面)。

这是我认为的创建链接:

<%= 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

我收到以下错误:

“PagesController#create 中的 ActiveRecord::RecordNotFound - 找不到没有 ID 的书”

我这样做完全错了吗?我知道 Rails 4 改变了 params 的工作方式,这与获取 URL 参数的语法相同,所以也许这就是导致这个问题的原因。

编辑:我也尝试从“新”中获取参数作为变量,然后将其用作 id,但我得到了相同的错误消息。

4

2 回答 2

0

new_page_path 将在这里调用“新”操作,即 GET。它不会像您期望的那样调用“创建”操作。理想情况下,您要调用“创建”操作。尝试这个:

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

link_to 通常应该只指向 GET 操作。对于此类事情,首选用户 button_to。

于 2013-06-04T19:48:36.253 回答
0

我认为您正在寻找(注意:id 而不是:book):

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

然后将您的创建方法更新为:

def create
  @book = Book.find(params[:id])
  ...
end
于 2015-05-29T11:45:31.337 回答