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" %>
我不断对其中一个进行更改,而另一个实际上是正在渲染的那个。我把正确的语法放在一个部分,现在它正常工作。这个故事的寓意是总是使用偏见,即使你认为你不需要它们。
答案 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:
每次创建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
操作的预测。