2014-12-16 2 views
1

Моя проблема заключается в том, как назначить несколько ассоциаций assign_to с вложенными атрибутами?рельсы множественные привязки belogs_to с вложенными атрибутами

Я хочу создать систему проблем. Когда я создаю проблему, я также хочу создать первый комментарий как тело проблемы.

Итак, у меня есть следующие модели:

class Issue < ActiveRecord::Base 
    has_many :comments, as: :commentable 

    validates :title, presence: true 

    accepts_nested_attributes_for :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :commentable, polymorphic: true 

    validates :content, :user, presence: true 
end 

и у меня есть IssuesController следующим образом:

class IssuesController < ApplicationController 
    before_action :authenticate_user! #devise authentication 

    def new 
    @issue = Issue.new 
    @issue.comments.build 
    end 

    def create 
    @issue = Issue.new(issue_params) 
    @issue.save 
    end 

    private 

    def issue_params 
    params.require(:issue).permit(:title, comments_attributes: [:content]) 
    end 
end 

и следующая моя форма (используя тонкий шаблон с simple_form и nested_form драгоценных камней):

= simple_nested_form_for @issue do |f| 

    = f.input :title 

    = f.fields_for :comments do |cf| 
    = cf.input :content 

    = f.button :submit 

в этом случае, я не знаю, как назначить current_user для комментарий, созданный вложенными атрибутами.

Любые предложения или другие подходы? Благодаря!

+0

скрытое поле под названием: пользователь в комментариях? –

+0

Я пробовал этот подход, и он работает. Но я думаю, что это не безопасно. –

+0

Что вы подразумеваете под защитой? Страх перед пользователем, играющим с полем? Затем сделайте это в контроллере. При создании комментария передайте текущего пользователя в качестве атрибута и проверьте его снова при создании. –

ответ

1

Как я писал в комментариях, есть два способа сделать это. Первый способ добавить скрытое поле в подчиненной для установки текущего пользователя:

= simple_nested_form_for(@issue) do |f| 
    = f.input :title 
    = f.fields_for(:comments) do |cf| 
    = cf.input(:content) 
    = cf.hidden(:user, current_user) 
    = f.submit 

Если вы не доверяете этот подход в страхе пользователей возился с полями в браузере, вы можете также сделать это в вашем контроллере.

class IssuesController < ApplicationController 
    before_action :authenticate_user! #devise authentication 

    def new 
    @issue = Issue.new 
    @issue.comments.build 
    end 

    def create 
    @issue = Issue.new(issue_params) 
    @issue.comments.first.user = current_user 
    @issue.save 
    end 

    private 

    def issue_params 
    params.require(:issue).permit(:title, comments_attributes: [:content]) 
    end 
end 

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

0

Вы также можете добавить user_id как current_user.id при использовании Params

class IssuesController < ApplicationController 
    before_action :authenticate_user! #devise authentication 

    def new 
    @issue = Issue.new 
    @issue.comments.build 
    end 

    def create 
    @issue = Issue.new(issue_params) 
    @issue.save 
    end 

    private 

    def issue_params 
    params[:issue][:comment][:user_id] = current_user.id 
    params.require(:issue).permit(:title, comments_attributes: [:content, :user_id]) 
    end 
end 
+0

Доза это означает, что мне нужно добавить метод комментариев или ассоциацию для выпуска модели? –