Ruby on rails 如何在Rails上生成带有RESTful路由的链接?

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的操作“

我遇到一个按钮问题,该按钮链接到当前名为“客户端”的控制器上的“新建”操作

单击时,会显示Rails路由错误:

没有与[发布]匹配的路由“客户端/新”

这是我正在使用的产生错误的代码:

<%= 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
问题是复制/粘贴错误,而哈希选项问题是对文档的误读。现在已经整理好了,请确认。谢谢一切似乎都很好,希望这将有助于其他类似的问题在未来。迈克尔,谢谢你的帮助,马克回答道。