我不知道这个问题。使用宝石设计和全球化。 我不知道是不是原因,但是form_for在html中生成了错误的操作,看看:
form class =“edit_status”id =“edit_status_1”action =“/ 1 / statuses / update”method =“post”accept-charset =“UTF-8”
我在状态之前放置。我不知道为什么。
的form_for
form_for(@status,url:statuses_update_path(@status),方法:: post)do | f |
设置方法帖子,因为控制器在没有它的情况下接收 id = update 。
下面的问题详情。
错误
No route matches {:action=>"/statuses/390022407", :controller=>"statuses", :status
=>{:content=>"Lorem ipsum"}}
Routes.db
Rails.application.routes.draw do
scope "(:locale)", locale: /en|pl/ do
post 'statuses/update'
resources :statuses, only: [:update]
end
end
Rails路线
控制器
class StatusesController < ApplicationController
before_action :authenticate_user!
before_action :set_locale
def update
#code...
end
private
def status_params
params.require(:status).permit(:content)
end
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
end
测试代码
require 'test_helper'
class StatusesControllerTest < ActionController::TestCase
include Devise::Test::ControllerHelpers
def setup
@user = users(:brock)
@status = statuses(:statusBrock)
I18n.default_locale = :en
end
test "should not update when not logged in" do
patch status_path(@status), params: { status: { content: "Lorem ipsum" } }
assert_redirected_to new_user_session_path
end
test "should update when logged in user admin" do
sign_in @user
patch status_path(@status), params: { status: { content: "Lorem ipsum" } }
assert_equal "Lorem ipsum", @status.content
end
end
有什么遗失?
答案 0 :(得分:0)
我并不是很清楚你正在尝试做什么。
post 'statuses/update'
resources :statuses, only: [:update]
这里定义了两条路由 - 一条是状态/更新的帖子,没有额外的参数,第二条是/ status / status_id。
您正在调用
statuses_update_path(@status)
将@status作为参数传递给路径,除了路由不接受id参数之外,它接受一个语言环境参数。
您是否有理由希望路由成为状态/更新而不是更多RESTful状态/?我将删除第一个路由,并使用内置的Rails命名约定。
编辑: 此外,在您的测试代码中,您只测试第二条路线 - 它不清楚为什么您有这两条不同的路线,并且您需要在它们之间切换。