2017-01-02 25 views
0

在我的Rails應用程序中,有鏈接到其他外部頁面的鏈接(@post.link給了我鏈接)。如果current_user點擊鏈接,則應該觸發控制器操作,即動作viewed,該操作應該更新我的數據庫,更具體地說是一個連接表,其中包含用戶查看鏈接的信息。Rails:通過link_to與外部鏈接(並更新連接表)呼叫控制器動作

我已經這樣做的遠:

在我的意見/職位/ index.html的:

# Looping through all the posts 
<%= link_to post.title, post.link, target: "_blank", controller: "posts", action: "viewed" %> 

在我posts_controller.rb

def viewed 
    @post = Post.find(params[:id]) 
    @post.views.create(user_id: current_user.id) 

    #respond_to do |format| 
    # format.html { redirect_to posts_path } 
    # format.js 
    #end 
end 

我創建了一個名爲views的連接表,其列user_id:integerpost_id:integer

在我的模型/ view.rb

belongs_to :user 
belongs_to :post 

validates_uniqueness_of :post_id, scope: :user_id 

在我的模型/ user.rb

has_many :views, dependent: :destroy 
has_many :viewed_posts, through: :views, source: :post 

在我的模型/ post.rb

has_many :views, dependent: :destroy 
has_many :viewed_user, through: :views, source: :user 

在我的routes.rb(我沒有任何改變或添加任何新的路由)

devise_for :users, :controllers => {:registrations => "users/registrations", :sessions => "users/sessions"} resources :users, only: [:show] resources :thumbnails, only: [:new] resources :posts, except: [:show] do member do post 'upvote' post 'fupvote' end end authenticated :user do root "posts#index" end 

我的問題

當我點擊的鏈接,我的意見表不更新? (例如,在我的rails控制檯View.find_by(user_id: some_user_which_has_clicked_on_links.id)View.all給了我零

+0

什麼回報'@ post.views.create(USER_ID:current_user.id)' 。也許你應該使用'create!'或測試返回值? – djothefou

+0

我不確定,但在** link_to **方法中,您將使用第二個參數中的鏈接,或者使用**控制器**和**動作**鍵進行哈希處理。但使用兩者似乎沒有任何意義 – djothefou

+0

將其更改爲'@ post.views。!create()'並用新的錯誤日誌更新我們,很可能存在驗證失敗或者將錯誤值傳遞給創建函數 – amrdruid

回答

0

我現在已經嘗試使用Ajax解決方法:

我的觀點

<%= link_to(view_post_path(post), :method => :post, :remote => true) do %> 
    <%= post.title %> 
<% end %> 

我的routes.rb

resources :posts, except: [:show] do 
    member do 
    post 'upvote' 
    post 'view' 
    end 
end 

我的posts_controll er.rb

def view 
    @post.views.create(user_id: current_user.id) 

    respond_to do |format| 
    format.html { redirect_to posts_path } 
    #It now renders my external link. Problem: I cannot open it in a new tab. 
    format.js { render :js => "window.location = '#{@post.link}';"} 
    end 
end 

我的意見/職位/ view.js。ERB

// Do some javascript magic here 

問題 我不是真正的快樂與我的解決方案,因爲還有許多事情真的不能搞清楚兩個小問題:

  1. 當它呈現在我的控制我的鏈接,該鏈接應該在 新標籤(例如「_blank」)中打開,而不在同一個窗口中。而不是 window.location我試過window.open,但沒有任何反應。
  2. 當用戶通過鼠標懸停在鏈接上時,瀏覽器顯示/posts/[:post_id]/view。如果它已經顯示「真實」鏈接 - 即@post.link - 比如www.google.com會更好。
  3. 當用戶手動打開一個新標籤頁的鏈接,就會發生錯誤,例如:無路由匹配[GET] "/posts/605/view"