Rails表单助手link_to的问题

时间:2011-02-02 02:23:02

标签: ruby-on-rails

我的一个视图中有以下两行代码(ProjectController中的索引操作)下面的代码位于一个循环中,它将@projects实例变量循环为project

    <td><%= link_to(project.name, :action => 'show', :id => project.id) %></td>
    <td><%= link_to("Edit", :action => 'edit', :id => project.id ) %></td>

第一个助手给了我这个链接:              http://localhost:3000/project/show/1等,而第二个帮助器输出:http://localhost:3000/project/edit?id=1等我希望这两个链接遵循相同的约定。 IE浏览器。 Rails首选的那个(第一个)

这是我的控制器方法:

class ProjectController < ApplicationController
  def index
    @projects = Project.find(:all)
  end

  def new
    @project = project.new
  end

  def edit
    @project = Project.find(params[:id])
  end

  def show
    @project = Project.find(params[:id])
  end

end

为简洁起见,未显示某些行动。

更新:我得到了相同的链接?如果我使用:

 <td><%= link_to(project.type, :action => 'edit', :id => project.id ) %></td>

其中type是我数据库中项目表的另一列之一。

3 个答案:

答案 0 :(得分:3)

确保在routes.rb

中声明您的资源
map.resources :posts

然后在控制台中运行rake routes,以便您可以查看所有路线。

以下是该资源所需的链接。我将首先进行编辑,因为这是您需要帮助的地方,并记住用嵌入的ruby标签包围所有这些链接<%= %>

@post.each do |post|  
  link_to "Edit", edit_post_path(post)
  link_to "Destroy", post, :method => :delete, :confirm => "Are you sure?"
  link_to "Show", post
  link_to "New Post", new_post_path
end

那些应该是该资源所需的所有链接

更新

如果您没有使用REST,那么从长远来看它会使事情变得更容易,而且rails非常好地是一个REST API,您可以创建一个命名路由进行编辑。否则你可以添加它来格式化你的路线,但这些类型的路线不安全:

map.connect ':controller/:id/:action' 

将其添加到routes.rb,它会为您提供一个非RESTful Rails应用,其中包含REST视图:)

答案 1 :(得分:0)

我不知道为什么你会用相同的语法得到不同的结果,但它们似乎都不正确我认为原因是当link_to使用url_for创建路径时,不会传递:id参数。 / p>

我认为你可以使用其中一个假设你使用资源:routes.rb中的项目:

<td><%= link_to(project.name, { :action => 'show', :id => project.id } ) %></td>
<td><%= link_to("Edit", { :action => 'edit', :id => project.id } ) %></td> 

或:

<td><%= link_to(project.name, project_path(project.id) ) %></td>
<td><%= link_to("Edit", edit_project_path(project.id) ) %></td>

答案 2 :(得分:0)

MyApplication::Application.routes.draw do
  get "project/index"

  get "project/new"

  get "project/create"

  get "project/update"

  get "project/delete"

  get "project/destroy"

  get "project/edit" <---- Notice this line

  match ':controller(/:action(/:id(.:format)))'
end

问题是由Routes.rb文件以某种方式创建的。我在routes.rb文件的底部有一个catch-all routes路由到我的路由 - 这在Rails 3.0中现已弃用,Rails 3.0现在鼓励资源路由。

当我生成项目控制器时,它将这些获取行添加到路径文件中。这些获取行对应于我通过控制台生成控制器时定义的操作。而show动作是手动生成的,因此会回到最后一行。