Ruby on Rails:从URL获取Params

时间:2013-06-04 19:40:15

标签: ruby-on-rails-4

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

我有两个带有has_many和belongs_to关联的模型,我们称之为Books和Pages。我想创建一个新的Page记录并将其链接到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

我收到以下错误:

  

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

link_to通常只应指向GET操作。对于这样的事情,用户button_to是首选。

答案 1 :(得分:0)

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

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

然后将您的create方法更新为:

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