2016-01-01 2 views
0

Я новичок в рубине на рельсах. Я создаю приложение для форума. В дополнение к сообщению и комментариям по сообщениям, я хочу, чтобы частная система обмена сообщениями в приложении. Сообщение должно быть отправлено желаемому пользователю («только этот пользователь может видеть сообщение»). Для этого я сгенерировал модель Уведомление, имеющее сообщение в качестве столбца.

Уведомление Модельсистема уведомлений в приложении

class Notification < ActiveRecord::Base 
    belongs_to :user 
end 

Уведомление миграции

class CreateNotifications < ActiveRecord::Migration 
    def change 
    create_table :notifications do |t| 
     t.text :message 
     t.timestamps null: false  
     t.references :user, index: true, foreign_key: true  
    end 
    end 
end 

Notification контроллер

class NotificationsController < ApplicationController 


    def index 
     @notifications = Notification.all.order("created_at DESC") 

    end 

    def new 
     @notification = Notification.new 
    end 

    def create 
     @notification = Notification.new notification_params 
     if @notification.save 
      redirect_to(:controller => "posts", :action => "index") 
     else 
      render "new" 
     end 
    end 

    private 

    def notification_params 
     params.require(:notification).permit(:message, :user_id) 
    end 

end 

Уведомление # новый вид

<%= form_for(:notification, :url => {:action => "create"}) do |f| %> 

    <%= f.text_field(:message, :placeholder => "Enter your message") %> 
    <%= f.hidden_field(:user_id, :value => session[:user_id]) %> 
    <%= f.submit("send message") %> 

<% end %> 

Как я могу отправить целевой атрибут пользователя в форме? или есть другой способ для системы обмена сообщениями?
Пожалуйста, помогите мне. Я ценю ваши ответы. Заранее спасибо.

+0

Я думаю, что если у вас есть 't.references: user' устанавливает' user_id', поэтому вы установите это дважды в своей миграции. –

ответ

2

Вам необходимо сохранить ссылку на получателя в уведомлении.

t.integer :recipient_id

class Notification < ActiveRecord::Base 
    belongs_to :recipient, class_name: 'User' 
end 

Также не установить user_id в форме, установить его в контроллере. (В противном случае любой может создать уведомление для кого-либо еще, просто отправив неверный ввод).

class NotificationsController < ApplicationController 
    def create 
    @user = User.find(session[:user_id]) 
    @notification = @user.notifications.new notification_params 
    # ... 
    end 
end 

Не полное решение, но укажет вам в правильном направлении.

+0

откуда получатель пришел (принадлежит_to: recipient, class_name: 'User'). И что такое class_name: «Пользователь»? Я очень новичок в рельсах. Можете ли вы объяснить мне ясно? –

+1

'recipient_id' - это просто имя столбца, чтобы сохранить идентификатор получателя. Я сделал это, вы можете назвать его, как вам нравится. Но вам нужна ссылка на пользователя, который получит уведомление. Rails может определить имя класса из пользователя belongs_to: user, но: получатель не является другим классом, вы хотите, чтобы он ссылался на других пользователей, поэтому вам нужно указать рельсы в этом случае. –

+0

и в модели уведомлений вы использовали belongs_to: recipient, class_name: 'User'. Но мы не объявляли получателя модели. Как мы можем использовать ассоциацию. Извините Если это глупое ожидание. Я очень новичок в рельсах. –