Automatyczne przypisanie Usera do Posta podczas jego tworzenia

Witam!
Mam model Post wygenerowany automatycznie za pomoca Scaffold, do tego mam Users stworzone za pomoca Devise w Rails Admin.
Chcialbym aby tworzony post byl przypisany do usera.

W post.rb mam
belongs_to: user

W user.rb
has_many: posts

Mam tez w tabeli posts dodana kolumne user_id.
Aby stworzyc post nalezy sie zalogowac chcialbym aby podczas tworzenia posta w momencie klikniecia new zostal przekazywany parametr user_id w odpowiednie miejsce. Niestety nie wiem jak to zrobic.
Co nalezy dodac do kontrolera

 def new
    @post = Post.new
...
end
 def create
    @post = Post.new(params[:ad])
...
end

W jaki sposob odczytac id usera z devise (RailsAdmin) podczas zalogowania?
Czy lepiej stworzyc osobny widok do tworzenia postow czy tez robic to z panelu admina?

Devise ma metodę current_user która zwraca Ci zalogowanego obecnie użytkownika.

W kontrolerze:

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

O, podobny kod był wektorem ostatniego ataku na Githuba.

Nikos: upewnij się w attr_accesible Post nie masz user_id. Ewentualnie kod zaproponowany przez Zlw zmień na

[code]def create
@post = Post.build(params[:post])
@post.user = current_user

i tutaj save czy save! czy co tam wolisz

end[/code]

rly? jak będę mieć w params user_id to on ma wyższy “priorytet” niż ten wynikający z relacji z current_user?

a jak z kombosami w stylu Post.where(user_id: current_user.id).new(params[:post])

atrybuty podane do metoby build są po prostu mergowane, czyli podając user_id w parametrach zostanie on nadpisany w metodzie build

def build(attributes = {}) attrs = self.format.decode(connection.get("#{new_element_path}").body).merge(attributes) self.new(attrs) end
https://github.com/rails/rails/blob/3-2-stable/activeresource/lib/active_resource/base.rb#L716

W drugim przykładzie stanie się to samo.

Przynajmniej dla attr_protected build() nie nadpisze chronionego atrybutu więc można śmiało build(params) używać.

Dziekuje za odp.
A czy zamiast “bulid” wykorzystam “new” tez bedzie poprawnie dzialac?

def create
    @post = Post.new(params[:post])
		@post.user = current_user
...

nie łatwiej sprawdzić ;] ale tak będzie działać

Sprawdzilem ze dziala, raczej chodzilo mi czy bedzie poprawnie. Dzieki

No przecież dokładnie to napisałem we wcześniejszym poście.

Podczepię się pod ten temat.
Też gem devise. Pytanie jak zabezpieczyć całość tak, żeby user mógł edytować tylko swoje posty?

Wiadomo w indexie można zrobić tak: @posts = current_user.posts.all i po sprawie. W edycji można zrobić tak:
@posts = current_user.posts.find(params[:id]) i jak ktoś będzie chciał edytowac nie swojego posta to pokaże, że nie ma takiego posta.

Pytanie, można to jakoś lepiej i ładniej zrobić? Nie wiem, może zabezpieczyć jakoś całość?

mozliwe ze strzele z dziala w muche ale warto wiedziec ze takie gemy istnieja


Możesz też sobie dodać coś takiego:

[code=Ruby]class PostsController < ApplicationController
before_filter :find_post, only: [:show, :edit, :update, :destroy]

… treść kontrolera

private
def find_post
@post = Post.find(params[:id])
redirect_to posts_path, alert: “Nie tykaj cudzego posta!” if @post.user != current_user
end
end[/code]