我在一个安静的控制器中有一些额外的,非Restful的动作。一个动作响应GET,一个表单,表单执行POST / PATCH(我已尝试过两个),另一个动作。如果不满足要求,则响应POST的方法会向模型添加错误消息,并呈现第一个操作,完全类似于编辑和更新,或者新建和创建。但...
如果第二个动作必须回溯到我在日志中看到的第一个动作它是正确的,但之后立即发出请求以获取第二个动作,这显然是因为那里&#39 ; s没有第二个动作的GET路径。最终结果是我没有将错误传递给表单。为什么是这样?可能是什么原因造成的?这让我疯了。
这是代码
def finish_subscription
unless user_signed_in?
store_location_for :user,request.path
redirect_to new_user_session_path
else
@user ||=User.find_by(subscribe_token: params[:token])
authorize! :finish_subscription,@user
@user.accepted_t_and_c = false
end
end
def confirm_subscription
@user=User.find_by(subscribe_token: params[:token])
authorize! :confirm_subscription,@user
if @user.update_attributes(user_params)
o = @user.orders.create
o.build_a_default_subscription
o.save
session[:active_order_id] = o.id
@user.subscribe_token = nil
@user.save
redirect_to pay_via_braintree_path
else
# I've tried all combinations of render action: 'finish_subscription', render :finish_subscription & etc
render 'finish_subscription'
end
end

这是我在日志中看到的内容; -
Started POST "/users/confirm_subscription/d6bb1ffbe56207b6c6864e739e9a455b"
当验证错误失败时,它会到达
行render 'finish_subscription'
响应; -
Rendered users/finish_subscription.html.haml within layouts/application (2.4ms)
这是我的期望。但随后,紧接着......
Started GET "/users/confirm_subscription/d6bb1ffbe56207b6c6864e739e9a455b"
WTF !!!当然,这会失败,因为该行动没有GET路线。
为什么会出现这种情况的原因?为什么它会在一个阳光明媚的周日下午发生,当时我有更好的事情要做?