Ruby on rails 如何在Rails上生成带有RESTful路由的链接?
我遇到一个按钮问题,该按钮链接到当前名为“客户端”的控制器上的“新建”操作 单击时,会显示Rails路由错误: 没有与[发布]匹配的路由“客户端/新” 这是我正在使用的产生错误的代码:Ruby on rails 如何在Rails上生成带有RESTful路由的链接?,ruby-on-rails,rest,routing,Ruby On Rails,Rest,Routing,我遇到一个按钮问题,该按钮链接到当前名为“客户端”的控制器上的“新建”操作 单击时,会显示Rails路由错误: 没有与[发布]匹配的路由“客户端/新” 这是我正在使用的产生错误的代码: <%= button_to("New Client", new_client_path, :class => "btn btn-lg btn-primary pull-right add-button" ) %> 然后我得到以下错误: 未知行动。找不到ClientsController的操作“
<%= button_to("New Client", new_client_path, :class => "btn btn-lg btn-primary pull-right add-button" ) %>
然后我得到以下错误:
未知行动。找不到ClientsController的操作“创建”
控制器操作新建和创建:
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
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
现在,客户机是我创建的唯一资源。使用RESTful路由轻松创建链接,我还缺少什么?请检查您的
路由.rb
,并确保您已添加资源:客户端
您还应该查看一下,发现您的路线呼叫错误
例如,clients\u new\u path
应该是new\u client\u path
如果您进行了这两项更改,但仍然存在问题。看起来错误将出现在客户端控制器中
确保您已经添加了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
结束尝试以下方法:
<%= button_to("New Client", new_client_path, :class => "btn btn-lg btn-primary pull-right add-button" ) %>
“btn btn lg btn主拉右添加按钮”)%>
您必须使用“客户机”,而不是“客户机”来创建单个客户机要使这项工作适合您,需要做一些更改。首先,您的路由是冗余的,并且与Rails约定相冲突。您应该删除所有get
路由,只使用资源
路由。这就是客户路线所需的全部内容:
Rails.application.routes.draw do
# notice, no "get" routes
resources :clients
end
接下来,button_to
默认为POST
方法,因此在使用GET
路由时必须覆盖它的方法。有关更多信息,请参阅
请尝试以下方法:
<%= button_to("New Client", new_client_path, { method: :get, :class => "btn btn-lg btn-primary pull-right add-button" } ) %>
最后,尝试使用clients\u path
route helper会导致ClientController#index
方法的路径(例如/clients
),并伴随着与create
方法相关的错误。create
操作是与index
操作具有相同URL路径的POST
路由。如果查看此资源的rake routes
输出,您将看到以下内容:
Rails.application.routes.draw do
get 'clients/index'
get 'clients/show'
get 'clients/new'
get 'clients/edit'
get 'clients/delete'
resources :clients
end
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
的GET
,在该路径的正下方,有一个未命名的条目,用于向相同的/clients
路径发送邮件。在最右边,您可以看到GET
方法路由到clients#index
操作,而POST
方法路由到clients#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
在这种情况下,button_to
的默认方法是POST
,它试图路由到客户端#create
操作,这不是您想要做的。您几乎不应该直接向create
、update
或destroy
方法发送任何内容,并且在您这样做的少数情况下,您会非常谨慎地执行此操作,并且知道这是不正常的(不是不正确的,只是不正常的)Rails使用。routes.rb文件包括以下资源:clients,使用为每个视图自动生成的get routes进行allong。我尝试更改为新的客户端路径,但它显示的是完全相同的路由错误消息。我有它,但它是空的。已填充,但显示相同的错误。我是否缺少routes文件中的某些内容?已将Controller和routes.rb文件添加到原始帖子中。已按照前面的问题进行了尝试,但单击时仍显示相同的错误。编辑帖子,使其显示问题的当前状态。您能发布您的客户吗?rb?将其添加到原始帖子中。这解决了我的问题,但必须进行一些更改,而不是“btn btn lg btn primary pull right add button”})%>
,由于参数数错误,我不得不修改从clients\u path
到new\u client\u path
的路由,并在同一个大括号内修改方法和类。它最终是这样工作的:
。请编辑答案,将其标记为已回答。@JorgeCuevas非常好的反馈,谢谢您让我知道!我已经更新了答案,并对按钮的两个哈希值添加了更多的解释。new_client_path
问题是复制/粘贴错误,而哈希选项问题是对文档的误读。现在已经整理好了,请确认。谢谢一切似乎都很好,希望这将有助于其他类似的问题在未来。迈克尔,谢谢你的帮助,马克回答道。