2017-01-04 88 views
4

编辑:感谢您的回复,我尝试了下面列出的所有内容,但现在仍然是运气。如果我输入localhosts/posts/new,它会将我带到表单中,但是当我从导航栏单击时链接不起作用。我更新了代码并包含了我的耙路结果。路线无法正常工作

我是新来红宝石,并通过教程工作,但是我的一个链接不工作,不知道发生了什么。

我的导航链接创建一个新帖子并没有把我带到正确的页面,当我点击链接到“posts_path”页面没有改变。

我可以通过在地址栏中输入/ posts/new来创建新帖子,但是当我点击导航栏上的“新帖子”链接时,页面不会更新(尽管网址显示/帖子) 。任何想法如何解决这个问题?

配置/ 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 

应用/视图/布局/ _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 

耙路由:

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 
+0

我无法在头文件中看到新的帖子链接。 – abhi110892

+1

'耙路线'将帮助您 –

+0

您是否尝试了我提到的建议? – Milind

回答

1

Rails扫描从顶部到底部的路线即routes.rb。每当它找到匹配的路线对应控制器#动作得到执行,剩余的全部将被跳过(稍后找到匹配后的路线)。

在这种情况下,路线是冲突的,所以做下面的changeseverything会正常工作。 的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 
+1

谢谢,这对我有效 – user2647092

1

的链接代码,以新的岗位

<%= link_to "New Post", new_post_path %> 
+0

简要和模糊。请解释它如何解决提问者的问题并与帖子相关。 – clearlight

1

尝试new_post_path

此外,rake routes在终端将列出所有的路线,为您仔细检查对相关的帮手。

最后,在您的路径文件中添加'as'至:get '/posts', to: 'posts#new', as: 'new_post'将允许您定义自己的路径名(在本例中为new_post_path,但您可以将其设置为您想要的任何内容)。

1
<%= link_to "Posts", posts_path %> corresponds to index action not to the new action. 

删除routes.rb中您的帖子控制器的唯一条件,它将创建所需的所有基本路由而不是特定的路由。

resources :posts 

所以,new_post_path回报/职位/新

最后添加一个链接,链接<%= link_to 'New Post', new_post_path %>

2

我建议你删除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_to "New Post", new_post_path %>基于引导的位置:http://guides.rubyonrails.org/v4.2/routing.html#path-and-url-helpers

1

这可能有助于重定向,
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组成。

OR

推重定向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。它调用了新的控制器方法。
让我知道您的反馈!谢谢

1

根据您的耙路输出以下应该工作

<%= link_to "New Post", posts_new_path %> 

请让我们知道是否有任何错误上点击新链接后在控制台正在添加日志。

2

问题是您的路线中存在冲突。 您已经为new

get /posts', to: 'posts#new', as: 'new_post' 

resources :posts, only: [:new, :create, :destroy] 

定义的路由的两倍,现在有用于posts#new 2条路径。我建议你012 删除第一个。您HTML更改为

<li><%= link_to 'New Post', posts_path %></li> 

,它应该工作的罚款。

2

我经历了您的代码...这是我建议添加/编辑更改..并确定它应该工作:)。

  1. routes.rb,它看起来不错BUT 有一个复制网址entry.So要么删除get 'posts/new'resources :posts, only: [:new, :create, :destroy]因为它们都将通过单独的输出你的路由创建posts#new一个重复的条目。您可以验证这一点txt文件由rake routes >> path.txt
  2. app/views/layouts/_header.html.erb,它的好也不需要任何改变。
  3. posts_controller.rb,有一个条件只为登录用户添加,请检查您是否已登录否则删除该条件并再次检查。
  4. 最后,在镀铬/ Firefox中使用F12调试,看看你的网络浏览器控制台之前得到的日志后点击查看有没有一些JavaScript错误与否。
2

删除get 'sessions/new' & get '/posts', to: 'posts#new', as: 'new_post'

重新启动服务器

,并尝试link_to "Posts", new_post_path, method: :post

应工作

+1

路径帮助程序不是'new_post_path'吗? –

+0

是的,你说得对,我修好了 – Falkwn

1

的底线是,你想要做的事情在非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,你的路线将不会有歧义。