我们说我的表格是:
/类别/新
当表单输入无效时,我调用render。经典例子:
def create
@category = Category.new(category_params)
if @category.save
flash[:success] = 'Category successfully created.'
redirect_to @category
else
render 'new'
end
end
我的问题是,为什么调用渲染后的网站路径只是:
/类别
而不是:
/类别/新
根据我的理解' new'表格应该在同一页面上呈现,这两条路径显然不相同。
正如评论者在此处所建议的还有其他信息:
相关路线:
resources :categories do
resources :topics, name_prefix: 'category_',
except: [:index, :show, :edit, :update, :destroy]
end
类别新动作:
def new
@category = Category.new
end
答案 0 :(得分:0)
不要将网址显示的内容与实际呈现的内容混淆。
简答
当您最初输入表单时,实际上是POST
到/categories
。这当然映射到控制器中的create
操作,当验证失败导致新表单呈现时 - 它不会重定向,因此网址不会发生变化 - 网址仍然与之相同当你进入行动时做了。
详细说明
当您调用/categories/new
时,您实际上被路由到类别控制器上的new
操作。
您的new
操作会设置任何实例变量,例如@category,rails会渲染包含新类别表单的new.html.erb。
当您提交表单时,它实际上正在执行http POST
到/categories
,它会路由到您的类别控制器的create
操作。 url和http方法是form_for帮助器生成的结果:
<%= form_for @category do |f| %>
这就是网址从/categories/new
更改为/categories
现在create
操作如果验证失败,则只需渲染新表单 - 它不会重定向到任何地方 - 网址与进入此操作时保持不变 - 这意味着它保持为{{1 }}
不要将网址中的更改与重定向混淆,只是表单发布到与/ categories / new不同的网址,而网址的更改实际上只是一个整容问题。< / p>
现在,如果您担心,可以将路由更改为以下内容:
/categories
这是将POST和GET http方法映射到/ new_category,因此对于new和create action invocations,url显示相同。请注意,您需要更改form_for帮助程序中的URL以使用此新路由:
resources :categories, except: [:create, :new]
post 'new_category' => 'categories#create'
get 'new_category' => 'categories#new'