在我的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:integer
和post_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
给我零?
答案 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
<强>问题强> 我对我的解决方案并不满意,因为有两个小问题我无法弄清楚:
window.location
我已经尝试了window.open
,但没有任何反应。/posts/[:post_id]/view
。如果它已经显示“真实”链接会更好 - 即@post.link
- 如www.google.com
。"/posts/605/view"