【发布时间】: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_by、find和rescue;如果您的路由设置正确并且set_category绑定到正确的控制器方法,那么只需一个Category.find调用和通常的RailsRecordNotFound处理就足够了。 -
目前我有:
resources :categoriesresources :products在单独的行上。我假设您的意思是使用 do 子句和嵌套在类别下的产品来设置它?
标签: ruby-on-rails exception parameters strong-parameters