【问题标题】:Ruby on Rails: Getting Params from URLRuby on Rails:从 URL 获取参数
【发布时间】:2013-06-04 19:40:14
【问题描述】:

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

我有两个具有 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#create 中的 ActiveRecord::RecordNotFound - 无法 查找没有 ID 的书”

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

编辑:我也尝试从 'new' 获取参数作为变量,然后将其用作 id,但我收到相同的错误消息。

【问题讨论】:

  • 嗨。在 Rails4 中 strong_parameters 是默认值。因此,您应该允许您从 url 或表单中获得的每个参数。在您的情况下,您应该有一个 book_params 并且这 book_params 可以与 find 一起使用。
  • @book = Book.find(book_params) under private in your controller def book_params params[:book].permit(:id, :name) end

标签: ruby-on-rails-4


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2012-06-30
      • 2015-10-26
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      相关资源
      最近更新 更多