2017-01-04 87 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,你的路線將不會有歧義。