我有一个表单,我的新模板和编辑模板都用于名为product的模型。在我的控制器中,对于创建和更新操作,它会重定向到@product,然后呈现" show"一旦成功。当使用`form_for @product do | f |声明表单时,这可以正常工作,但如果使用符号而不是实例变量,它会尝试POST到同一页面。 I.E.如果我在页面上产品/ 4 /编辑并且我在表单上按了提交,它会给我一个路由错误,它试图POST产品/ 4 /编辑,它只有资源中的GET路由。
现在,如果我输入url选项" url:products_path"它正确地重定向到products / 4,就像我使用form_for @product一样。这是否意味着使用带有form_for的符号不会进入我的控制器操作?为什么要尝试POST自己?
这是表格
<%= form_for @product do |f| %> <-- Changing this to :product gives routing error
<% if @product.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@product.errors.count, "error") %> prohibited this product from being saved:</h2>
<ul>
<% @product.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :title %><br>
<%= f.text_field :title %>
</div>
<div class="field">
<%= f.label :description %><br>
<%= f.text_area :description, rows: 6 %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
这是我的控制器操作,用于更新和创建:
def create
@product = Product.new(product_params)
respond_to do |format|
if @product.save
format.html { redirect_to @product, notice: 'Product was successfully created.' }
format.json { render :show, status: :created, location: @product }
else
format.html { render :new }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
def update
respond_to do |format|
if @product.update(product_params)
format.html { redirect_to @product, notice: 'Product was successfully updated.' }
format.json { render :show, status: :ok, location: @product }
else
format.html { render :edit }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
答案 0 :(得分:1)
当你在表单中使用符号时,它基本上告诉form_builder你正在为什么样的对象创建表单。如果碰巧有一个实例变量设置为例如@product,那么表单甚至足够聪明,可以在渲染输入变量时获取值。但是,为了通过rails resourceful routing确定正确的url路径,您需要传递资源。
@product与以下产品不同:产品。实例变量反映了系统中的资源,因此可以为其生成资源丰富的路由。当使用符号时,情况并非如此,这就是为什么需要明确设置url参数。
使用:product时,表单操作的网址会设置当前网页的网址,这就是您的提交进入编辑操作的原因。