路由无法正常工作
Routes not working correctly
编辑: 感谢您的回复,我尝试了下面列出的所有方法,但现在仍然很幸运。如果我键入 localhosts/posts/new,它会将我带到表单,但是当我从导航栏中单击时,link 不起作用。我更新了代码并包含了我的佣金路线结果。
我是 ruby 的新手,正在学习教程,但是我的 link 中的一个不工作,我不确定发生了什么。
我的导航 link 创建一个新的 post 没有带我到正确的页面,当我点击 link 到 "posts_path" 页面没有改变。
我可以通过在地址栏中输入 /posts/new 来创建一个新的 posts,但是当我点击导航栏上的 "New Post" link页面不更新(尽管 url 显示 /posts)。知道如何解决这个问题吗?
config/routes.rb
Rails.application.routes.draw do
get 'sessions/new'
root 'static_pages#home'
get '/search', to: 'static_pages#search'
get '/login', to: 'sessions#new'
get '/posts', to: 'posts#new', as: 'new_post'
post '/login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'
get '/signup', to: 'users#new'
get 'users/new'
get 'static_pages/home'
get 'posts/new'
get 'sessions/new'
resources :users
resources :account_activations, only: [:edit]
resources :password_resets, only: [:new, :create, :edit, :update]
resources :posts, only: [:new, :create, :destroy]
end
app/views/layouts/_header.html.erb
<header class="navbar navbar-fixed-top navbar-inverse">
<div class="container">
<% link_to "sample app", root_path, id: "logo" %>
<nav>
<ul class="nav navbar-nav navbar-right">
<li><%= link_to "Home", root_path %></li>
<li><%= link_to "Search", search_path %></li>
<% if logged_in? %>
<li><%= link_to "Users", users_path %></li>
<li><%= link_to "Posts", posts_new_path %></li>
<li class="dropdown">
<a href='#' class="dropdown-toggle" data-toggle="dropdown">Account <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><%= link_to "Profile", current_user %></li>
<li><%= link_to "Settings", edit_user_path(current_user) %></li>
<li class="divider"></li>
<li><%= link_to "Logout", logout_path, method: "delete" %></li>
</ul>
</li>
<% else %>
<li><%= link_to "Log in", login_path %></li>
<% end %>
</ul>
</nav>
</div>
posts_controller.rb
class PostsController < ApplicationController
before_action :logged_in_user, only: [:create, :destroy]
before_action :correct_user, only: :destroy
def create
@post = current_user.posts.build(post_params)
if @post.save
flash[:success] = "Post created!"
redirect_to root_url
else
@feed_items = []
render 'static_pages/home'
end
end
def destroy
@post.destroy
flash[:success] = "Post Deleted"
redirect_to request.referrer || root_url
end
def new
@post = current_user.posts.build if logged_in?
end
private
def post_params
params.require(:post).permit(:description, :picture)
end
def correct_user
@post = current_user.posts.find_by(id:params[:id])
redirect_to root_url if @post.nil?
end
end
rake 路线:
password_resets_new GET /password_resets/new(.:format) password_resets#new
password_resets_edit GET /password_resets/edit(.:format) password_resets#edit
sessions_new GET /sessions/new(.:format) sessions#new
root GET / static_pages#home
search GET /search(.:format) static_pages#search
login GET /login(.:format) sessions#new
new_post GET /posts(.:format) posts#new
POST /login(.:format) sessions#create
logout DELETE /logout(.:format) sessions#destroy
signup GET /signup(.:format) users#new
users_new GET /users/new(.:format) users#new
static_pages_home GET /static_pages/home(.:format) static_pages#home
static_pages_about GET /static_pages/about(.:format) static_pages#about
static_pages_search GET /static_pages/search(.:format) static_pages#search
posts_new GET /posts/new(.:format) posts#new
GET /password_resets/new(.:format) password_resets#new
GET /password_resets/edit(.:format) password_resets#edit
GET /sessions/new(.:format) sessions#new
help GET /help(.:format) static_pages#help
about GET /about(.:format) static_pages#about
contact GET /contact(.:format) static_pages#contact
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
edit_account_activation GET /account_activations/:id/edit(.:format) account_activations#edit
password_resets POST /password_resets(.:format) password_resets#create
new_password_reset GET /password_resets/new(.:format) password_resets#new
edit_password_reset GET /password_resets/:id/edit(.:format) password_resets#edit
password_reset PATCH /password_resets/:id(.:format) password_resets#update
PUT /password_resets/:id(.:format) password_resets#update
posts POST /posts(.:format) posts#create
GET /posts/new(.:format) posts#new
post DELETE /posts/:id(.:format) posts#destroy
代码 link 到新的 post
<%= link_to "New Post", new_post_path %>
尝试new_post_path
此外,终端中的 rake routes
会列出所有路由和相关帮助程序,供您仔细检查。
最后,将 'as' 添加到: get '/posts', to: 'posts#new', as: 'new_post'
在你的路由文件中将允许你定义自己的路径名(在本例中为 new_post_path,但你可以将其设置为任何内容你会喜欢)。
<%= link_to "Posts", posts_path %> corresponds to index action not to the new action.
在 routes.rb 中删除帖子控制器的唯一条件,这将创建所需的所有基本路由,而不是特定路由。
resources :posts
所以,new_post_path returns /posts/new
最后加一个linklink<%= link_to 'New Post', new_post_path %>
我建议您删除 get 'posts/new'
和 get '/posts', to: 'posts#new', as: 'new_post'
,因为它们是重复的路线。
您已经在路线 resources :posts, only: [:new, :create, :destroy]
中创建了正确的路线。通过包含 new
,Rails 正在为您完成这部分工作。看这里:http://guides.rubyonrails.org/v4.2/routing.html#crud-verbs-and-actions
那么您应该可以使用其他人发布的link。
<%= link_to "New Post", new_post_path %>
基于此处的指南:http://guides.rubyonrails.org/v4.2/routing.html#path-and-url-helpers
这可能有助于重定向,
在 routes.rb、
resources :posts
它给出了所有默认控制器方法的路径,如索引、新建、创建、编辑、更新、显示、销毁。然后检查耙路线。获取相应的路径,如
new_post GET /posts/new(.:format) posts#new
如果它正确意味着给url喜欢,
<%= link_to 'New Post', new_post_path %>
它重定向到控制器中的新方法并呈现相应的 html.erb 页面。这个url由routes.rb.
组成
或
推送重定向 url manually.In html 页面,
<%= button_tag "New", :onclick => "getNew()" %>
function getNew(){
var form = document.forms[0];
// get the id and value with any variable //
form.method = "post";
// pass the value to parameters //
form.var name = column name; (description r picture)
form.action = "posts/new";
form.submit();
}
在 routes.rb、
match '/posts/new' => 'posts#new', via: [:get, :post]
它使手动重定向url。它调用新的控制器方法。
让我知道您的反馈!谢谢
Rails 从上到下扫描路由 即routes.rb。每当它找到匹配的路由时,相应的 controller#action 就会被执行,其余的将被跳过(找到匹配后的后续路由)。
在这种情况下路由是冲突的,所以做下面的改变一切都会正常的。
config/routes.rb
Rails.application.routes.draw do
get 'sessions/new'
root 'static_pages#home'
get '/search', to: 'static_pages#search'
get '/login', to: 'sessions#new'
#get '/posts', to: 'posts#new', as: 'new_post' #not required as resources :posts will do the job in last line
post '/login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'
get '/signup', to: 'users#new'
get 'users/new'
get 'static_pages/home'
get 'posts/new', to: 'posts#new', as: 'posts_new_path' #Made changes here according to helper used in view 'posts_new_path'
get 'sessions/new'
resources :users
resources :account_activations, only: [:edit]
resources :password_resets, only: [:new, :create, :edit, :update]
resources :posts, only: [:new, :create, :destroy]
end
根据你的rake routes输出,以下应该有效
<%= link_to "New Post", posts_new_path %>
请让我们知道在单击新 post link 时控制台日志中是否出现任何错误。
问题是您的路由发生了冲突。
您已经为 new
定义了两次路由
get /posts', to: 'posts#new', as: 'new_post'
和
resources :posts, only: [:new, :create, :destroy]
现在 posts#new
有 2 条路径。我建议你 删除 第一个。将 html 更改为
<li><%= link_to 'New Post', posts_path %></li>
它应该可以正常工作。
我查看了您的代码...这就是我建议 add/edit 更改的内容..确保它应该有效:)。
- 对于
routes.rb
,看起来不错BUT
有一个 duplicate url entry.So 删除 get 'posts/new'
或 resources :posts, only: [:new, :create, :destroy]
因为它们都会为 [=14= 创建一个重复条目].您可以通过 rake routes >> path.txt
在单独的 txt 文件中输出您的路线来验证这一点
- 在
app/views/layouts/_header.html.erb
中,它也很好,不需要任何改变。
- 在
posts_controller.rb
中,为仅登录用户添加了条件 ,请检查您是否已登录,否则请删除该条件并再次检查。
- 最后,在 chrome/firefox 中使用
F12
进行调试,看看您在 Web 浏览器控制台 before 和 after[ 中得到了什么日志=30=]点击查看是否有javascript错误。
删除 get 'sessions/new'
& get '/posts', to: 'posts#new', as: 'new_post'
重启服务器
并尝试 link_to "Posts", new_post_path, method: :post
应该可以
归根结底,您正在尝试以 non-Rails 方式做事。 Rails 更喜欢约定而不是配置,这意味着如果你不按照 Rails 的方式做事,你会过得很糟糕。
这意味着你应该清理你的路线,直到你没有不必要的重复。现在你有 3 条不同的路线去 posts#new
,每条路线都有不同的路径前缀。
我会删除:
get '/posts', to: 'posts#new', as: 'new_post'
get 'posts/new'
因为 resources :posts, only: [:new, :create, :destroy]
已经创建了该路由。然后你的 new_post_path
助手应该创建正确的 URL 并且你的路线将没有歧义。
编辑: 感谢您的回复,我尝试了下面列出的所有方法,但现在仍然很幸运。如果我键入 localhosts/posts/new,它会将我带到表单,但是当我从导航栏中单击时,link 不起作用。我更新了代码并包含了我的佣金路线结果。
我是 ruby 的新手,正在学习教程,但是我的 link 中的一个不工作,我不确定发生了什么。
我的导航 link 创建一个新的 post 没有带我到正确的页面,当我点击 link 到 "posts_path" 页面没有改变。
我可以通过在地址栏中输入 /posts/new 来创建一个新的 posts,但是当我点击导航栏上的 "New Post" link页面不更新(尽管 url 显示 /posts)。知道如何解决这个问题吗?
config/routes.rb
Rails.application.routes.draw do
get 'sessions/new'
root 'static_pages#home'
get '/search', to: 'static_pages#search'
get '/login', to: 'sessions#new'
get '/posts', to: 'posts#new', as: 'new_post'
post '/login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'
get '/signup', to: 'users#new'
get 'users/new'
get 'static_pages/home'
get 'posts/new'
get 'sessions/new'
resources :users
resources :account_activations, only: [:edit]
resources :password_resets, only: [:new, :create, :edit, :update]
resources :posts, only: [:new, :create, :destroy]
end
app/views/layouts/_header.html.erb
<header class="navbar navbar-fixed-top navbar-inverse">
<div class="container">
<% link_to "sample app", root_path, id: "logo" %>
<nav>
<ul class="nav navbar-nav navbar-right">
<li><%= link_to "Home", root_path %></li>
<li><%= link_to "Search", search_path %></li>
<% if logged_in? %>
<li><%= link_to "Users", users_path %></li>
<li><%= link_to "Posts", posts_new_path %></li>
<li class="dropdown">
<a href='#' class="dropdown-toggle" data-toggle="dropdown">Account <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><%= link_to "Profile", current_user %></li>
<li><%= link_to "Settings", edit_user_path(current_user) %></li>
<li class="divider"></li>
<li><%= link_to "Logout", logout_path, method: "delete" %></li>
</ul>
</li>
<% else %>
<li><%= link_to "Log in", login_path %></li>
<% end %>
</ul>
</nav>
</div>
posts_controller.rb
class PostsController < ApplicationController
before_action :logged_in_user, only: [:create, :destroy]
before_action :correct_user, only: :destroy
def create
@post = current_user.posts.build(post_params)
if @post.save
flash[:success] = "Post created!"
redirect_to root_url
else
@feed_items = []
render 'static_pages/home'
end
end
def destroy
@post.destroy
flash[:success] = "Post Deleted"
redirect_to request.referrer || root_url
end
def new
@post = current_user.posts.build if logged_in?
end
private
def post_params
params.require(:post).permit(:description, :picture)
end
def correct_user
@post = current_user.posts.find_by(id:params[:id])
redirect_to root_url if @post.nil?
end
end
rake 路线:
password_resets_new GET /password_resets/new(.:format) password_resets#new
password_resets_edit GET /password_resets/edit(.:format) password_resets#edit
sessions_new GET /sessions/new(.:format) sessions#new
root GET / static_pages#home
search GET /search(.:format) static_pages#search
login GET /login(.:format) sessions#new
new_post GET /posts(.:format) posts#new
POST /login(.:format) sessions#create
logout DELETE /logout(.:format) sessions#destroy
signup GET /signup(.:format) users#new
users_new GET /users/new(.:format) users#new
static_pages_home GET /static_pages/home(.:format) static_pages#home
static_pages_about GET /static_pages/about(.:format) static_pages#about
static_pages_search GET /static_pages/search(.:format) static_pages#search
posts_new GET /posts/new(.:format) posts#new
GET /password_resets/new(.:format) password_resets#new
GET /password_resets/edit(.:format) password_resets#edit
GET /sessions/new(.:format) sessions#new
help GET /help(.:format) static_pages#help
about GET /about(.:format) static_pages#about
contact GET /contact(.:format) static_pages#contact
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
edit_account_activation GET /account_activations/:id/edit(.:format) account_activations#edit
password_resets POST /password_resets(.:format) password_resets#create
new_password_reset GET /password_resets/new(.:format) password_resets#new
edit_password_reset GET /password_resets/:id/edit(.:format) password_resets#edit
password_reset PATCH /password_resets/:id(.:format) password_resets#update
PUT /password_resets/:id(.:format) password_resets#update
posts POST /posts(.:format) posts#create
GET /posts/new(.:format) posts#new
post DELETE /posts/:id(.:format) posts#destroy
代码 link 到新的 post
<%= link_to "New Post", new_post_path %>
尝试new_post_path
此外,终端中的 rake routes
会列出所有路由和相关帮助程序,供您仔细检查。
最后,将 'as' 添加到: get '/posts', to: 'posts#new', as: 'new_post'
在你的路由文件中将允许你定义自己的路径名(在本例中为 new_post_path,但你可以将其设置为任何内容你会喜欢)。
<%= link_to "Posts", posts_path %> corresponds to index action not to the new action.
在 routes.rb 中删除帖子控制器的唯一条件,这将创建所需的所有基本路由,而不是特定路由。
resources :posts
所以,new_post_path returns /posts/new
最后加一个linklink<%= link_to 'New Post', new_post_path %>
我建议您删除 get 'posts/new'
和 get '/posts', to: 'posts#new', as: 'new_post'
,因为它们是重复的路线。
您已经在路线 resources :posts, only: [:new, :create, :destroy]
中创建了正确的路线。通过包含 new
,Rails 正在为您完成这部分工作。看这里:http://guides.rubyonrails.org/v4.2/routing.html#crud-verbs-and-actions
那么您应该可以使用其他人发布的link。
<%= link_to "New Post", new_post_path %>
基于此处的指南:http://guides.rubyonrails.org/v4.2/routing.html#path-and-url-helpers
这可能有助于重定向,
在 routes.rb、
resources :posts
它给出了所有默认控制器方法的路径,如索引、新建、创建、编辑、更新、显示、销毁。然后检查耙路线。获取相应的路径,如
new_post GET /posts/new(.:format) posts#new
如果它正确意味着给url喜欢,
<%= link_to 'New Post', new_post_path %>
它重定向到控制器中的新方法并呈现相应的 html.erb 页面。这个url由routes.rb.
或
推送重定向 url manually.In html 页面,
<%= button_tag "New", :onclick => "getNew()" %>
function getNew(){
var form = document.forms[0];
// get the id and value with any variable //
form.method = "post";
// pass the value to parameters //
form.var name = column name; (description r picture)
form.action = "posts/new";
form.submit();
}
在 routes.rb、
match '/posts/new' => 'posts#new', via: [:get, :post]
它使手动重定向url。它调用新的控制器方法。
让我知道您的反馈!谢谢
Rails 从上到下扫描路由 即routes.rb。每当它找到匹配的路由时,相应的 controller#action 就会被执行,其余的将被跳过(找到匹配后的后续路由)。
在这种情况下路由是冲突的,所以做下面的改变一切都会正常的。 config/routes.rb
Rails.application.routes.draw do
get 'sessions/new'
root 'static_pages#home'
get '/search', to: 'static_pages#search'
get '/login', to: 'sessions#new'
#get '/posts', to: 'posts#new', as: 'new_post' #not required as resources :posts will do the job in last line
post '/login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'
get '/signup', to: 'users#new'
get 'users/new'
get 'static_pages/home'
get 'posts/new', to: 'posts#new', as: 'posts_new_path' #Made changes here according to helper used in view 'posts_new_path'
get 'sessions/new'
resources :users
resources :account_activations, only: [:edit]
resources :password_resets, only: [:new, :create, :edit, :update]
resources :posts, only: [:new, :create, :destroy]
end
根据你的rake routes输出,以下应该有效
<%= link_to "New Post", posts_new_path %>
请让我们知道在单击新 post link 时控制台日志中是否出现任何错误。
问题是您的路由发生了冲突。
您已经为 new
get /posts', to: 'posts#new', as: 'new_post'
和
resources :posts, only: [:new, :create, :destroy]
现在 posts#new
有 2 条路径。我建议你 删除 第一个。将 html 更改为
<li><%= link_to 'New Post', posts_path %></li>
它应该可以正常工作。
我查看了您的代码...这就是我建议 add/edit 更改的内容..确保它应该有效:)。
- 对于
routes.rb
,看起来不错BUT
有一个 duplicate url entry.So 删除get 'posts/new'
或resources :posts, only: [:new, :create, :destroy]
因为它们都会为 [=14= 创建一个重复条目].您可以通过rake routes >> path.txt
在单独的 txt 文件中输出您的路线来验证这一点
- 在
app/views/layouts/_header.html.erb
中,它也很好,不需要任何改变。 - 在
posts_controller.rb
中,为仅登录用户添加了条件 ,请检查您是否已登录,否则请删除该条件并再次检查。 - 最后,在 chrome/firefox 中使用
F12
进行调试,看看您在 Web 浏览器控制台 before 和 after[ 中得到了什么日志=30=]点击查看是否有javascript错误。
删除 get 'sessions/new'
& get '/posts', to: 'posts#new', as: 'new_post'
重启服务器
并尝试 link_to "Posts", new_post_path, method: :post
应该可以
归根结底,您正在尝试以 non-Rails 方式做事。 Rails 更喜欢约定而不是配置,这意味着如果你不按照 Rails 的方式做事,你会过得很糟糕。
这意味着你应该清理你的路线,直到你没有不必要的重复。现在你有 3 条不同的路线去 posts#new
,每条路线都有不同的路径前缀。
我会删除:
get '/posts', to: 'posts#new', as: 'new_post'
get 'posts/new'
因为 resources :posts, only: [:new, :create, :destroy]
已经创建了该路由。然后你的 new_post_path
助手应该创建正确的 URL 并且你的路线将没有歧义。