2017-01-02 26 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"