如何在Rails上生成与RESTful路由的链接?

时间:2016-05-25 18:37:45

标签: ruby-on-rails rest routing

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

单击时会显示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路由轻松创建链接我缺少什么?

3 个答案:

答案 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。分离哈希值很重要,否则您将无法获得您正在寻找的行为。 methodclass选项位于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操作,这不是您想要做的。您几乎不应该直接向POSTclients#createcreate方法发送任何内容,并且在您执行此操作的少数情况下,您将非常谨慎地执行此操作,并且知道它是异常的(不正确,只是异常)Rails使用。