Rails中的链接和路由

时间:2014-07-15 00:34:31

标签: ruby-on-rails ruby-on-rails-4.1

Rails 4.1
Ruby 2.1.1

我有一个应用程序,我需要显示控制器show方法的链接。据我所知,这样的事情会做到这一点:

<%= link_to "Agent", agents_path(:id => agent.id), :class => "btn btn-warning" %>

但是当Rails生成链接时,就是这样:

http://mydomain/agents?id=9

我需要的是

http://mydomain/agents/9. 

当我手动输入时,我会看到座席/节目视图。我怎么去那里?

在我的路线中,我对代理商没有任何特别之处。这是来自routes.rb的相关代码:

resources :agents

这意味着它将生成所有路线。

rake路线输出:

agents GET    /agents(.:format)               agents#index
POST   /agents(.:format)                      agents#create
new_agent GET    /agents/new(.:format)        agents#new
edit_agent GET    /agents/:id/edit(.:format)  agents#edit
agent GET    /agents/:id(.:format)            agents#show
PATCH  /agents/:id(.:format)                  agents#update
PUT    /agents/:id(.:format)                  agents#update
DELETE /agents/:id(.:format)                  agents#destroy

我没有在生成路线时出现任何错误

解决方案:

道歉,但我使用的是agent_path,而不是agents_path。我曾经尝试过agent_path,这是我尝试过的一件事。问题是我有两种不同的观点。在一个方面,我使用了正确的语法:

<%= link_to "Agent", agent_path(agent.id), :class => "btn btn-warning" %>

在我正在使用的另一个:

<%= link_to "Agent", agents_path(:id => agent.id), :class => "btn btn-warning" %>

我不断对其中一个进行更改,而另一个实际上是正在渲染的那个。我把正确的语法放在一个部分,现在它正常工作。这个故事的寓意是总是使用偏见,即使你认为你不需要它们。

3 个答案:

答案 0 :(得分:4)

您希望agent_path代替agents_path,而您无需指定id。这样可以正常工作:

<%= link_to "Agent", agent_path(agent), :class => "btn btn-warning" %>

无论何时对路线有何疑问,您都可以随时运行:

bundle exec rake routes

您将能够看到所有现有路线及其命名。

答案 1 :(得分:1)

只需将记录传递给link_to,即可自动生成指向其视图页的链接

= link_to 'Agent', agent
<a href="/agents/32">Agent</a>

您可以使用记录执行更多操作,例如,如果您需要指向编辑页面的链接

= link_to 'Agent', [:edit, agent]
<a href="/agents/32/edit">Agent</a>

依此类推......当编写必须与不同模型兼容的帮助程序时,此技术非常有用

答案 2 :(得分:1)

<强>路由

您需要考虑的是resourceful nature of Rails' routing

enter image description here

每次创建Rails路由结构的resources部分时,您实际上都在告诉rails构建上述路由。这是标准做法,意味着您可以将article_path(article.id)作为默认功能调用。

我相信你的问题源于这个想法:

<%= link_to "Agent", agents_path(:id => agent.id), :class => "btn btn-warning" %>

-

<强>参考

如上所述,当agents_path(单数)时,您引用agent_path(复数)。

但是,您还要在路由助手本身中定义:id参数。这可以通过将对象本身传递给帮助程序来处理:

<%= link_to article.title, article_path(article.id) %>

或者,更简洁一点,Rails能够根据您传递的资源确定路径(因此我提到了resourceful路由结构):

<%= link_to article.title, article %>

这将是您对show控制器的articles操作的预测。