Rails:使用link_to外部链接调用控制器操作(并更新连接表)

在我的rails应用程序中有post,其中包含指向其他外部页面的链接( @post.link为我提供了链接)。 如果current_user单击链接,则应触发控制器操作,即viewed的操作,该操作应更新我的数据库,更具体地说是具有用户查看链接的信息的连接表。

到目前为止我已经做了什么:

在我的views / posts / index.html中:

 # Looping through all the posts  

在我的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

在我的models / view.rb中

 belongs_to :user belongs_to :post validates_uniqueness_of :post_id, scope: :user_id 

在我的models / user.rb中

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

在我的models / 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给我零?

我现在尝试使用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_controller.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 

我的观点/post/ view.js.erb

 // Do some javascript magic here 

问题我对我的解决方案并不满意,因为有两个小问题我无法弄清楚:

  1. 当它在我的控制器中呈现我的链接时,链接应该在新选项卡中打开(例如“_blank”),而不是在同一个窗口中。 我没有尝试过window.location ,而是尝试了window.open ,但没有任何反应。
  2. 当用户使用鼠标hover在链接上时,浏览器会显示/posts/[:post_id]/view 。 如果它已经显示“真实”链接 – 即@post.link – 就像www.google.com一样会更好。
  3. 当用户手动在新选项卡中打开链接时,会发生错误,例如:没有路线匹配[GET] "/posts/605/view"