- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个基于 Ruby on Rails 的 Spree 电子商务商店,我想要一个自定义操作,用户可以在其中直接从结帐页面将他们的订单标记为完整,而无需通过交付等。我已经覆盖了所有结帐步骤,但无法通过将订单发送到订单 Controller 中的自定义操作来获得“结帐”按钮来完成订单。
我想我已经勾选了所有方框:在 routes.rb 中创建了一个补丁操作并检查了 rake 路由以确保该路由存在。但它仍然告诉我没有路线。
在我提交任何内容之前,购物车页面甚至都不会加载,并出现以下错误。我花了一整天的时间试图解决这个问题,所以任何想法都会很棒....
错误:
No route matches {:action=>"complete", :controller=>"spree/orders", :method=>:patch}
路线.rb:
resources :orders do
member do
patch 'complete', to: 'orders#complete'
end
end
rake 路线:
Prefix Verb URI Pattern Controller#Action
spree / Spree::Core::Engine
complete_order PATCH /orders/:id/complete(.:format) orders#complete
orders GET /orders(.:format) orders#index
POST /orders(.:format) orders#create
new_order GET /orders/new(.:format) orders#new
edit_order GET /orders/:id/edit(.:format) orders#edit
order GET /orders/:id(.:format) orders#show
PATCH /orders/:id(.:format) orders#update
PUT /orders/:id(.:format) orders#update
DELETE /orders/:id(.:format) orders#destroy
HTML:
<%= form_for :order, url: {action: 'complete', method: :patch} do |f| %>
<% f.submit %>
<% end %>
我还没有创建 Controller ,但它会是:
def complete
# mark order as complete
# redirect to confirmation page
end
非常感谢任何帮助。谢谢
编辑:这是更新后的 View (app/views/orders/edit.html.erb):
<% @body_id = 'cart' %>
<div data-hook="cart_container">
<h1><%= Spree.t(:shopping_cart) %></h1>
<% if @order.line_items.empty? %>
<div data-hook="empty_cart">
<div class="alert alert-info"><%= Spree.t(:your_cart_is_empty) %></div>
<p><%= link_to Spree.t(:continue_shopping), products_path, class: 'btn btn-default' %></p>
</div>
<% else %>
<div data-hook="outside_cart_form">
<%= form_for @order, url: update_cart_path, html: { id: 'update-cart' } do |order_form| %>
<div data-hook="inside_cart_form">
<div data-hook="cart_items" class="table-responsive">
<%= render partial: 'form', locals: { order_form: order_form } %>
</div>
</div>
<% end %>
</div>
<div id="empty-cart" class="col-md-6" data-hook>
<%= form_tag empty_cart_path, method: :put do %>
<p id="clear_cart_link" data-hook>
<%= submit_tag Spree.t(:empty_cart), class: 'btn btn-default' %>
<%= Spree.t(:or) %>
<%= link_to Spree.t(:continue_shopping), products_path, class: 'continue' %>
</p>
<% end %>
</div>
<div id="complete-order">
complete order here - submit to custom controller
<%= @order.id %>
<%= form_for @order, url: complete_order_path(@order) do |f| %>
<% f.submit %>
<% end %>
</div>
<% end %>
</div>
这是整个 Controller :
module Spree
class OrdersController < Spree::StoreController
before_action :check_authorization
rescue_from ActiveRecord::RecordNotFound, :with => :render_404
helper 'spree/products', 'spree/orders'
respond_to :html
before_action :assign_order_with_lock, only: :update
skip_before_action :verify_authenticity_token, only: [:populate]
def show
@order = Order.includes(line_items: [variant: [:option_values, :images, :product]], bill_address: :state, ship_address: :state).find_by_number!(params[:id])
end
def complete
@order = current_order
end
def update
if @order.contents.update_cart(order_params)
respond_with(@order) do |format|
format.html do
if params.has_key?(:checkout)
@order.next if @order.cart?
redirect_to checkout_state_path(@order.checkout_steps.first)
else
redirect_to cart_path
end
end
end
else
respond_with(@order)
end
end
# Shows the current incomplete order from the session
def edit
@order = current_order || Order.incomplete.
includes(line_items: [variant: [:images, :option_values, :product]]).
find_or_initialize_by(guest_token: cookies.signed[:guest_token])
associate_user
end
# Adds a new item to the order (creating a new order if none already exists)
def populate
order = current_order(create_order_if_necessary: true)
variant = Spree::Variant.find(params[:variant_id])
quantity = params[:quantity].to_i
options = params[:options] || {}
# 2,147,483,647 is crazy. See issue #2695.
if quantity.between?(1, 2_147_483_647)
begin
order.contents.add(variant, quantity, options)
rescue ActiveRecord::RecordInvalid => e
error = e.record.errors.full_messages.join(", ")
end
else
error = Spree.t(:please_enter_reasonable_quantity)
end
if error
flash[:error] = error
redirect_back_or_default(spree.root_path)
else
respond_with(order) do |format|
format.html { redirect_to cart_path }
end
end
end
def empty
if @order = current_order
@order.empty!
end
redirect_to spree.cart_path
end
def accurate_title
if @order && @order.completed?
Spree.t(:order_number, :number => @order.number)
else
Spree.t(:shopping_cart)
end
end
def check_authorization
order = Spree::Order.find_by_number(params[:id]) || current_order
if order
authorize! :edit, order, cookies.signed[:guest_token]
else
authorize! :create, Spree::Order
end
end
private
def order_params
if params[:order]
params[:order].permit(*permitted_order_attributes)
else
{}
end
end
def assign_order_with_lock
@order = current_order(lock: true)
unless @order
flash[:error] = Spree.t(:order_not_found)
redirect_to root_path and return
end
end
end
end
编辑
很明显,自从我发布这个问题以来,您实际上确实需要以特殊方式声明您的路线,尽管 rake 路线显示它们是正确的。
在 routes.rb 中,添加:
Spree::Core::Engine.routes.draw do
# add your custom routes here, e.g.
get '/terms-and-conditions' => 'home#terms', as: :terms
end
这将允许您使用 <%= link_to("Terms", terms_path) %> 助手。
参见 Adding Routes to Rails' Spree E-Commerce更多细节。我希望文档在这方面做得更好,因为据我所知,除了 SO 之外没有提到它。
最佳答案
发生这种情况是因为您没有将对象传递给表单。所以路由中没有id
参数,路由器匹配失败。
您的路线定义为 member
action ,这意味着它需要一个 id
参数。您正在传递一个符号。
<%= form_for :order <-- problem
线索在错误信息中:
No route matches {:action=>"complete", :controller=>"spree/orders", :method=>:patch}
请注意错误消息中的散列中为何没有 id
参数?
要解决这个问题,请为表单提供一个对象。例如:
<%= form_for @order, url: complete_order_path(@order) do |f| %>
在 Controller 中设置@order
实例变量。
附带说明一下,您可以像这样定义您的路线:
resources :orders do
member do
patch :complete
end
# or, since it's only one route...
patch :complete, on: :member
end
请注意,您可以使用符号,并且不必指定 Controller ,因为它是从资源名称中推断出来的。
最后,您不需要告诉表单该方法应该是补丁。 Rails 从传入的对象中推断出这一点,在本例中为 @order
。如果它是new,方法将为POST
,否则为PATCH
。
关于ruby-on-rails - Ruby on Rails - form_for 的自定义 PATCH 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35045327/
我正在努力做到这一点 在我的操作中从数据库获取对象列表(确定) 在 JSP 上打印(确定) 此列表作为 JSP 中的可编辑表出现。我想修改然后将其提交回同一操作以将其保存在我的数据库中(失败。当我使用
我有以下形式的 Linq to Entities 查询: var x = from a in SomeData where ... some conditions ... select
我有以下查询。 var query = Repository.Query() .Where(p => !p.IsDeleted && p.Article.ArticleSections.Cou
我正在编写一个应用程序包,其中包含一个主类,其中主方法与GUI类分开,GUI类包含一个带有jtabbedpane的jframe,它有两个选项卡,第一个选项卡包含一个jtable,称为jtable1,第
以下代码产生错误 The nested query is not supported. Operation1='Case' Operation2='Collect' 问题是我做错了什么?我该如何解决?
我已经为 HA redis 集群(2 个副本、1 个主节点、3 个哨兵)设置了本地 docker 环境。只有哨兵暴露端口(10021、10022、10023)。 我使用的是 stackexchange
我正在 Desk.com 中构建一个“集成 URL”,它使用 Shopify Liquid 模板过滤器语法。对于开始日期为 7 天前而结束日期为现在的查询,此 URL 需要包含“开始日期”和“结束日期
你一定想过。然而情况却不理想,python中只能使用类似于 i++/i--等操作。 python中的自增操作 下面代码几乎是所有程序员在python中进行自增(减)操作的常用
我需要在每个使用 github 操作的手动构建中显示分支。例如:https://gyazo.com/2131bf83b0df1e2157480e5be842d4fb 我应该显示分支而不是一个。 最佳答
我有一个关于 Perl qr 运算符的问题: #!/usr/bin/perl -w &mysplit("a:b:c", /:/); sub mysplit { my($str, $patt
我已经使用 ArgoUML 创建了一个 ERD(实体关系图),我希望在一个类中创建两个操作,它们都具有 void 返回类型。但是,我只能创建一个返回 void 类型的操作。 例如: 我能够将 book
Github 操作仍处于测试阶段并且很新,但我希望有人可以提供帮助。我认为可以在主分支和拉取请求上运行 github 操作,如下所示: on: pull_request push: b
我正在尝试创建一个 Twilio 工作流来调用电话并记录用户所说的内容。为此,我正在使用 Record,但我不确定要在 action 参数中放置什么。 尽管我知道 Twilio 会发送有关调用该 UR
我不确定这是否可行,但值得一试。我正在使用模板缓冲区来减少使用此算法的延迟渲染器中光体积的过度绘制(当相机位于体积之外时): 使用廉价的着色器,将深度测试设置为 LEQUAL 绘制背面,将它们标记在模
有没有聪明的方法来复制 和 重命名 文件通过 GitHub 操作? 我想将一些自述文件复制到 /docs文件夹(:= 同一个 repo,不是远程的!),它们将根据它们的 frontmatter 重命名
我有一个 .csv 文件,其中第一列包含用户名。它们采用 FirstName LastName 的形式。我想获取 FirstName 并将 LastName 的第一个字符添加到它上面,然后删除空格。然
Sitecore 根据 Sitecore 树中定义的项目名称生成 URL, http://samplewebsite/Pages/Sample Page 但我们的客户有兴趣降低所有 URL(页面/示例
我正在尝试进行一些计算,但是一旦我输入金额,它就会完成。我只是希望通过单击按钮而不是自动发生这种情况。 到目前为止我做了什么: Angular JS - programming-fr
我的公司创建了一种在环境之间移动文件的复杂方法,现在我们希望将某些构建的 JS 文件(已转换和缩小)从一个 github 存储库移动到另一个。使用 github 操作可以实现这一点吗? 最佳答案 最简
在我的代码中,我创建了一个 JSONArray 对象。并向 JSONArray 对象添加了两个 JSONObject。我使用的是 json-simple-1.1.jar。我的代码是 package j
我是一名优秀的程序员,十分优秀!