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: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
在我的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
问题我对我的解决方案并不满意,因为有两个小问题我无法弄清楚:
- 当它在我的控制器中呈现我的链接时,链接应该在新选项卡中打开(例如“_blank”),而不是在同一个窗口中。 我没有尝试过
window.location
,而是尝试了window.open
,但没有任何反应。 - 当用户使用鼠标hover在链接上时,浏览器会显示
/posts/[:post_id]/view
。 如果它已经显示“真实”链接 – 即@post.link
– 就像www.google.com
一样会更好。 - 当用户手动在新选项卡中打开链接时,会发生错误,例如:没有路线匹配[GET]
"/posts/605/view"