Rails 3: Заполнение поля формы / базы данных автоматически в зависимости от текущего пользователя? - PullRequest
0 голосов
/ 24 января 2011

В моем приложении rails есть модель posts , в которой есть поле формы / базы данных для sender , которое я хочу автоматически заполнить current_user как генерируется Authlogic. По сути, я хочу отслеживать человека, который создал / отправил «пост», и не позволять ему менять это поле.

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

def new
   @post = Post.new :sender => current_user.username

   respond_to do |format|
     format.html # new.html.erb
     format.xml  { render :xml => @post }
   end
end

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

Какой лучший способ сделать это?

Заранее спасибо за помощь!

~ Dan

Ответы [ 3 ]

2 голосов
/ 24 января 2011

Похоже, вы должны установить модельное отношение между ними, или это то, что у вас уже есть.

в вашем методе создания просто сделайте это

@post = current_user.posts.create(params[:post])

Это не требует поляв интерфейсе и обеспечивает связь между пользователем и его сообщениями

РЕДАКТИРОВАТЬ комментарии

Похоже, вам нужно изменить в post.rb

belongs_to :user

на

belongs_to :sender, :class_name => "User"

РЕДАКТИРОВАТЬ в схему

В соответствии с вашей моделью вы просто сохраняете строку отправителя / получателя, поскольку в этом случае вам нужно сделать следующее:

in controller#create
@post = Post.create(params[:post])
@post.sender = current_user.username

РЕДАКТИРОВАТЬ: Как это сделать правильно

Исходя из вашего комментария, похоже, что вы хотите сделать это в реляционной форме, хорошо.

Прежде всего, для вашего поста вам нужно изменить отправителя и получателя на целые числа и переименовать, затем sender_id и receive_id соответственно.

Далее в вашей модели user.rb вам необходимо иметь следующее:

has_many :sent_posts, :foreign_key => "sender_id"
has_many :received_posts, :foreign_key => "receiver_id"

В вашей модели post.rb вам понадобитсяследующее:

belongs_to :sender, :class_name => "User"
belongs_to :receiver, :class_name => "User"

Теперь вы можете сделать следующее при создании сообщения

@post = current_user.sent_posts.create(params[:post])

И доступны следующие методы

@post.sender                #=> gets the sender
@post.receiver              #=> gets the receiver
current_user.sent_posts     #=> all posts from this user
current_user.received_posts #=> all posts for this user

ПРИМЕЧАНИЕ Я не могу проверить это, но я уверен, что вышеприведенное должно работать для вас, могут быть небольшие ошибки, поскольку я не могу проверить еще раз

0 голосов
/ 24 января 2011

Хм .. почему бы не сделать это в действии create:

def create
  @post = Post.create(params[:post].merge({:sender => current_user.username}))
end
0 голосов
/ 24 января 2011

Вы всегда можете сделать так, чтобы модель before_create добавила значение для этого одного поля вместе с параметрами. Это обеспечило бы добавление значения непосредственно перед выполнением оператора create ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...