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

时间:2017-01-02 22:16:09

标签: ruby-on-rails ruby link-to jointable

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

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

在我的观看次数/帖子/ 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列。

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

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

1 个答案:

答案 0 :(得分: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_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

我的观看次数/帖子/ view.js.erb

// Do some javascript magic here 

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

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