路由无法正常工作

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 更改的内容..确保它应该有效:)。

  1. 对于routes.rb,看起来不错BUT 有一个 duplicate url entry.So 删除 get 'posts/new'resources :posts, only: [:new, :create, :destroy] 因为它们都会为 [=14= 创建一个重复条目].您可以通过 rake routes >> path.txt
  2. 在单独的 txt 文件中输出您的路线来验证这一点
  3. app/views/layouts/_header.html.erb中,它也很好,不需要任何改变。
  4. posts_controller.rb 中,为仅登录用户添加了条件 ,请检查您是否已登录,否则请删除该条件并再次检查。
  5. 最后,在 chrome/firefox 中使用 F12 进行调试,看看您在 Web 浏览器控制台 beforeafter[ 中得到了什么日志=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 并且你的路线将没有歧义。