首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > Ruby Rails >

访问地址页面出现异常No route matches "/MyTest" with {:method=>get}

2012-03-14 
访问地址页面出现错误No route matches /MyTest with {:method:get}按照书上的示例,生成了一个 contra

访问地址页面出现错误No route matches "/MyTest" with {:method=>:get}
按照书上的示例,生成了一个 contraller MyTestController,但是在访问 http://127.0.0.1:3000/mytest 时 报错 No route matches "/MyTest" with {:method=>:get},不知道是什么原因。我的rials的版本是2.1.0,不知道这个问题和版本变化有没有关系,谢谢。

[解决办法]
就是版本的问题。
http://www.javaeye.com/topic/162536

Recognizing the Environment



命名空间路由

好了,现在我们有一个骨瘦如柴的迷你博客像是模仿经典david在2005念做的一段15分钟创建一个BLOG的视频。现在我们更进一步:Post不应该让所有的人都可以去编辑他,我们的网站需要一个管理部分。让我们为它创建一个控制器:

./script/generate controller Admin::Posts

rails2.0 现在支持命名空间。他会创建一个子目录叫 app/controllers/admin.
我们所要作的是:
1.创建一个新的路由
2.把所有在旧的 posts控制器中的 action复制到新的 Admin::posts中
3.复制所有旧的posts视图到app/views/admin* ,在旧的posts 控制器中只留下 ‘index’和‘show’ 这两个action,
这意味着也要删除new 和 edit.
4.修改 我们刚刚复制的actions和views,让他能够知道他是在admin控制器中

首先,我们再次编辑 config/routes.rb:

Ruby代码 复制代码

1. map.namespace :admin do |admin|
2. admin.resources :posts
3. end

map.namespace :admin do |admin|
admin.resources :posts
end




这意味着我们现在有了带着 'admin'前缀的 posts的具名路由。这会使旧的POST路由和新的
admin post路由不会想混。像这样:

posts_path /posts
post_path(@post) /posts/:post_id
admin_posts_path /admin/posts
admin_post_path(@post) /admin/posts/:post_id

现在让我们从旧的POST控制器中拷贝ACTION并修改路由地址去适应新的命名空间:

Ruby代码 复制代码

1. # app/controllers/admin/posts_controller.rb
2. ...
3. def create
4. # old:
5. format.html { redirect_to(@post) }
6. # new:
7. format.html { redirect_to([:admin, @post]) }
8. end
9.
10. def update
11. # old:
12. format.html { redirect_to(@post) }
13. # new:
14. format.html { redirect_to([:admin, @post]) }
15. end
16.
17. def destroy
18. # old:
19. format.html { redirect_to(posts_url) }
20. # new:
21. format.html { redirect_to(admin_posts_url) }
22. end
23. ...

# app/controllers/admin/posts_controller.rb
...
def create
# old:
format.html { redirect_to(@post) }
# new:
format.html { redirect_to([:admin, @post]) }
end

def update
# old:
format.html { redirect_to(@post) }
# new:
format.html { redirect_to([:admin, @post]) }
end

def destroy
# old:
format.html { redirect_to(posts_url) }
# new:
format.html { redirect_to(admin_posts_url) }
end
...



不要忘记删除所有在app/controllers/posts_controller.rb中的方法,只要留下 ‘index’ 和‘show’两个方法。

现在,让我们拷贝视图(假设你的 shell已经在项目的根文件夹下):
cp app/views/posts/*.erb app/views/admin/posts
rm app/views/posts/new.html.erb
rm app/views/posts/edit.html.erb

现在让我们编辑 app/views/admin/posts中的视图:

Ruby代码 复制代码

1. <!-- app/views/admin/posts/edit.html.erb -->
2. <h1>Editing post</h1>
3.
4. <%= error_messages_for :post %>
5.
6. <% form_for([:admin, @post]) do |f| %>
7. ...
8. <% end %>
9.
10. <%= link_to 'Show', [:admin, @post] %> |
11. <%= link_to 'Back', admin_posts_path %>

<!-- app/views/admin/posts/edit.html.erb -->
<h1>Editing post</h1>

<%= error_messages_for :post %>

<% form_for([:admin, @post]) do |f| %>
 ...
<% end %>

<%= link_to 'Show', [:admin, @post] %> |
<%= link_to 'Back', admin_posts_path %>




Ruby代码 复制代码

1. <!-- app/views/admin/posts/new.html.erb -->
2. <h1>New post</h1>
3.
4. <%= error_messages_for :post %>
5.
6. <% form_for([:admin, @post]) do |f| %>


7. ...
8. <% end %>
9.
10. <%= link_to 'Back', admin_posts_path %>

<!-- app/views/admin/posts/new.html.erb -->
<h1>New post</h1>

<%= error_messages_for :post %>

<% form_for([:admin, @post]) do |f| %>
...
<% end %>

<%= link_to 'Back', admin_posts_path %>


Ruby代码 复制代码

1. <!-- app/views/admin/posts/show.html.erb -->
2. <p>
3. <b>Title:</b>
4. <%=h @post.title %>
5. </p>
6.
7. <p>
8. <b>Body:</b>
9. <%=h @post.body %>
10. </p>
11.
12. <%= link_to 'Edit', edit_admin_post_path(@post) %> |
13. <%= link_to 'Back', admin_posts_path %>

<!-- app/views/admin/posts/show.html.erb -->
<p>
<b>Title:</b>
<%=h @post.title %>
</p>

<p>
<b>Body:</b>
<%=h @post.body %>
</p>

<%= link_to 'Edit', edit_admin_post_path(@post) %> |
<%= link_to 'Back', admin_posts_path %>



Ruby代码 复制代码

1. <!-- app/views/admin/posts/index.html.erb -->
2. ...
3. <% for post in @posts %>
4. <tr>
5. <td><%=h post.title %></td>
6. <td><%=h post.body %></td>
7. <td><%= link_to 'Show', [:admin, post] %></td>
8. <td><%= link_to 'Edit', edit_admin_post_path(post) %></td>
9. <td><%= link_to 'Destroy', [:admin, post],
10. :confirm => 'Are you sure?', :method => :delete %></td>
11. </tr>
12. <% end %>
13. </table>
14.
15. <br />
16.
17. <%= link_to 'New post', new_admin_post_path %>

<!-- app/views/admin/posts/index.html.erb -->
...
<% for post in @posts %>
<tr>
<td><%=h post.title %></td>
<td><%=h post.body %></td>
<td><%= link_to 'Show', [:admin, post] %></td>
<td><%= link_to 'Edit', edit_admin_post_path(post) %></td>
<td><%= link_to 'Destroy', [:admin, post], 
:confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>
</table>

<br />

<%= link_to 'New post', new_admin_post_path %>



基本上完成了:如果你测试 http://localhost:3000/admin/posts,他应该能正常的工作。但看起来却很丑陋,那是因为我们没有全局的布局模板。

当我们生成第一个脚手架时,rails为post和 comment生成各自相关的布局模板。所以让我们删掉他们并且创建一个通用的:

cp app/views/layouts/posts.html.erb \
app/views/layouts/application.html.erb
rm app/views/layouts/posts.html.erb
rm app/views/layouts/comments.html.erb

然后让我们改一下标题:

Java代码 复制代码

1. <!-- app/views/layouts/application.html.erb -->
2. ...
3. <title>My Great Blog</title>
4. ...

<!-- app/views/layouts/application.html.erb -->
...
<title>My Great Blog</title>
...



他只剩下旧的在posts控制器里的'index' 和 ‘show’页面,他们仍然拥有我们有链接到我们删除过的方法的链接,所以我们可以删掉他们。


Ruby代码 复制代码

1. <!-- app/views/posts/index.html.erb -->
2. <h1>My Great Blog</h1>
3.
4. <table>
5. <tr>
6. <th>Title</th>
7. <th>Body</th>
8. </tr>
9.
10. <% for post in @posts %>
11. <tr>
12. <td><%=h post.title %></td>
13. <td><%=h post.body %></td>
14. <td><%= link_to 'Show', post %></td>


15. </tr>
16. <% end %>
17. </table>

<!-- app/views/posts/index.html.erb -->
<h1>My Great Blog</h1>

<table>
<tr>
<th>Title</th>
<th>Body</th>
</tr>

<% for post in @posts %>
<tr>
<td><%=h post.title %></td>
<td><%=h post.body %></td>
<td><%= link_to 'Show', post %></td>
</tr>
<% end %>
</table>




Ruby代码 复制代码

1. <!-- app/views/posts/show.html.erb -->
2. <p>
3. <b>Title:</b>
4. <%=h @post.title %>
5. </p>
6.
7. <p>
8. <b>Body:</b>
9. <%=h @post.body %>
10. </p>
11.
12. <% unless @post.comments.empty? %>
13. <h3>Comments</h3>
14. <% @post.comments.each do |comment| %>
15. <p><%= h comment.body %></p>
16. <% end %>
17. <% end %>
18.
19. <h3>New Comment</h3>
20.
21. <%= render :partial => @comment = Comment.new,
22. :locals => { :button_name => 'Create'}%>
23.
24. <%= link_to 'Back', posts_path %>

<!-- app/views/posts/show.html.erb -->
<p>
<b>Title:</b>
<%=h @post.title %>
</p>

<p>
<b>Body:</b>
<%=h @post.body %>
</p>

<% unless @post.comments.empty? %>
<h3>Comments</h3>
<% @post.comments.each do |comment| %>
<p><%= h comment.body %></p>
<% end %>
<% end %>

<h3>New Comment</h3>

<%= render :partial => @comment = Comment.new, 
:locals => { :button_name => 'Create'}%>

<%= link_to 'Back', posts_path %>



我们可以从浏览器中测试任何东西,进入 http://localhost:3000/admin/posts ,就能看到一切都工作的很好。但是,我们依旧少了样东西:一个系统管理部分不应该公开。现在你可以进去编辑任何东西了。我们需要认证。

[解决办法]
配置路由文件

添加
MyTest

热点排行