2017-01-02 3 views
0

В моем приложении 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.

В моей модели/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 

Моя проблема:

Когда я кликаю по ссылкам, мой вид таблицы не обновляются? (Например, в моей рельсах консоли 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 ** вы используете ссылку во втором параметре или Hash с ** контроллером ** и ** действием **. Но использовать оба кажется, что нет смысла – djothefou

+0

изменить его на '@ post.views.! Create()' и обновить нас с помощью нового журнала ошибок, скорее всего, произошла ошибка, которая не выполняется или вы передаете неправильное значение функции 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 

Мои сообщения_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.Еврорадио

// 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"
Смежные вопросы