【问题标题】:Handle parameter missing exception in rails处理rails中的参数丢失异常
【发布时间】:2016-12-10 21:32:10
【问题描述】:

我有一个类别和产品模型,其中产品模型属于一个类别。目前,我在类别显示视图上有一个链接,该链接将用户带到一个新的产品表单,并将类别 ID 设置为用户点击链接的类别。

为了更清楚: 用户选择一个类别 > 用户在类别显示视图上单击新产品链接 > 产品表单打开,类别 ID 设置为以前的类别。

我遇到的问题是,如果用户转到 /products/new 它会抛出参数丢失异常,因为找不到类别 ID(看到类别没有与地址请求一起发送)。

有没有办法可以防止用户简单地输入 /products/new 地址并尝试访问表单?我想要的是让用户在不点击类别页面上的链接的情况下尝试创建新产品时被重定向到主页。

我的产品控制器代码(与此问题相关):

def new
    @product = @category.products.new
  end

def set_category
      @category = Category.find_by(id: params[:category_id]) || Category.find(product_params[:category_id])
      rescue ActiveRecord::RecordNotFound
    end

private
    def product_params
      params.require(:product).permit(:category_id, :title, :description, :image_url, :price)
    end

类别展示页面上的新产品链接:

  %p= link_to t('.add'), new_product_path(category_id: @category)

异常指向的方法:

def product_params
    params.require(:product).permit(
        :category_id, :title, :description, :image_url, :price)
end

任何帮助将不胜感激,如果这有点不清楚,我们深表歉意。

【问题讨论】:

  • 您的路线是什么样的?也许您需要嵌套资源,以便根本没有 /products/new 路由。此外,对于@category,您不需要find_byfindrescue;如果您的路由设置正确并且set_category 绑定到正确的控制器方法,那么只需一个Category.find 调用和通常的Rails RecordNotFound 处理就足够了。
  • 目前我有:resources :categories resources :products 在单独的行上。我假设您的意思是使用 do 子句和嵌套在类别下的产品来设置它?

标签: ruby-on-rails exception parameters strong-parameters


【解决方案1】:

为什么不向您的新操作添加一个条件来检查参数是否存在?

unless params[:category_id].present?
  redirect_to somewhere
end

【讨论】:

  • 我试过了,但我仍然遇到同样的异常。它指向 def product params 方法(我会把它放在我原来的帖子中),并给出消息“param is missing or value is empty: product”
  • 尝试使用before_filter 代替
  • 完美,很有魅力。非常感谢,将标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多