我遇到一个按钮问题,该按钮链接到名为“客户端”的当前控制器上的“新建”操作。
单击时会显示Rails路由错误:
没有路线匹配[POST]“clients / new”
这是我正在使用的产生错误的代码:
<%= button_to("New Client", new_client_path, :class => "btn btn-lg btn-primary pull-right add-button" ) %>
如果我将路径更改为clients_path
,请执行以下操作:
<%= button_to("New Client", clients_path, :class => "btn btn-lg btn-primary pull-right add-button" ) %>
然后我收到以下错误:
未知行动。无法为ClientsController找到操作'create'
控制器操作new并创建:
def new
@client = Client.new
end
def create
@client = Client.new(client_params)
if @client.save
flash[:notice] = "Client added succesfully."
redirect_to client_path(@client)
else
render 'new'
end
end
routes.rb文件包含以下内容:
Rails.application.routes.draw do
get 'clients/index'
get 'clients/show'
get 'clients/new'
get 'clients/edit'
get 'clients/delete'
resources :clients
end
现在clients
是我创建的唯一资源。使用RESTful路由轻松创建链接我缺少什么?
答案 0 :(得分:1)
请检查您的routes.rb
并确保添加了resources :clients
。
您还应该查看documentation,看看您是否错误地调用了您的路线。
实施例。 clients_new_path
应为new_client_path
如果您同时进行这两项更改仍然存在问题。看起来错误将出现在 ClientsController 。
中确保您添加了create
操作。
def create
@client = Client.new(client_params)
if @client.save
flash[:notice] = 'App successfully created!'
redirect_to client_path(@client)
else
flash[:error] = @app.errors.full_messages.join(', ')
render 'new'
end
端
答案 1 :(得分:1)
尝试这种方式:
<%= button_to("New Client", new_client_path, :class => "btn btn-lg btn-primary pull-right add-button" ) %>
你必须使用&#34;客户&#34;而不是&#34;客户&#34;创建单个客户端
答案 2 :(得分:1)
需要更改一些内容才能使其适合您。首先,您的路由是多余的,并与Rails约定冲突。您应该删除所有get
路由,然后使用resources
路由。这就是您的客户路线所需要的一切:
Rails.application.routes.draw do
# notice, no "get" routes
resources :clients
end
接下来,button_to
默认使用POST
方法,因此在使用GET
路由时,必须覆盖它的方法。有关详细信息,请参阅button_to API documentation。
试试这个,而不是:
<%= button_to("New Client", new_client_path, { method: :get, :class => "btn btn-lg btn-primary pull-right add-button" } ) %>
请注意,button_to
与许多ActionView表单助手一样,接受2个单独的哈希值,第一个为options
,第二个为html_options
。分离哈希值很重要,否则您将无法获得您正在寻找的行为。 method
和class
选项位于html_options
。如果在调用中只有一个Hash of options(大括号是可选的),Ruby会将它们分配给最后一个哈希参数;你可以明确地提供所有哈希值,让你的代码清楚地告诉读者你想要什么,如:
<%= button_to("New Client", new_client_path, {}, { method: :get, :class => "btn btn-lg btn-primary pull-right add-button" } ) %>
最后,尝试使用clients_path
路由助手导致了ClientController#index
方法的路径(例如/clients
),并伴随着一个看似无关的{{1}错误}} 方法。 create
操作是create
路由,其路径与POST
操作相同。如果您查看此资源的index
输出,您会看到以下内容:
rake routes
查看 Prefix Verb URI Pattern Controller#Action
clients GET /clients(.:format) clients#index
POST /clients(.:format) clients#create
new_client GET /clients/new(.:format) clients#new
edit_client GET /clients/:id/edit(.:format) clients#edit
client GET /clients/:id(.:format) clients#show
PATCH /clients/:id(.:format) clients#update
PUT /clients/:id(.:format) clients#update
DELETE /clients/:id(.:format) clients#destroy
(在“前缀”下)与路径clients
的{{1}}匹配,并在其下方,GET
的未命名条目相同的/clients
路径。在最右侧,您可以看到POST
方法路由到/clients
操作,而GET
方法路由到clients#index
操作。
在这种情况下,POST
的默认方法是clients#create
,它试图路由到button_to
操作,这不是您想要做的。您几乎不应该直接向POST
,clients#create
或create
方法发送任何内容,并且在您执行此操作的少数情况下,您将非常谨慎地执行此操作,并且知道它是异常的(不正确,只是异常)Rails使用。