[rails3] Nadawanie autora news'a w scaffoldzie

Cześć,
Mołgby mi ktoś pomóc z dodaniem autora do news’a?
Rok temu o tym pisałem lecz teraz railsy się zmieniły i trochę jeszcze tego nie ogarniam…

Pozdr.

Generujesz migrację z dodaniem pola do bazy, aktualizujesz widoki i gotowe. Chyba nie oczekujesz, że ktoś poprowadzi Cię za rączkę z takim zadaniem?

Wyobraź sobie, że takie rzeczy już mam : )
I może nie dopisałem… Ale ja chcę aby autorem tekstu był zalogowany użytkownik…

To stwórz system użytkowników. http://railscasts.com/episodes/250-authentication-from-scratch

i jak już będziesz mał użytkowników, to robisz coś takiego:

current_user.posts.create params[:post]

Użytkowników mam dzięki devise.

undefined method `news' for #<User:0x2c08b84>

Taki dostaje komunikat po dodaniu:

current_user.posts.create params[:post]

powyższy kod dodaje do:

def create @news = current_user.news.create params[:news] ... end

a asocjację pomiędzy modelami News i User masz?

Pewnie ; )
User has_many :news
News belongs_to :user

EDIT:
Teraz zaczęło działać… News się dodaje lecz nadal nie przypisuje się użytkownik…

To może pokaż kod z kontrolera? :]

[code]news controller

class NewsController < ApplicationController
layout “news”
uses_tiny_mce :only => [:new, :edit]

GET /news

GET /news.xml

def index
@title = “Newsy”
@news = News.all

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

end

GET /news/1

GET /news/1.xml

def show
@recent_comment = Comment.limit(3)
@news = News.find(params[:id])

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

end

GET /news/new

GET /news/new.xml

def new
if current_user.try(:admin?)
@news = News.new(params[:news])

  respond_to do |format|
    format.html # new.html.erb
    format.xml  { render :xml => @news }
  end
else
  flash[:notice] = 'Nie masz uprawnień do stworzenia tego postu !'
  redirect_to root_url
end

end

GET /news/1/edit

def edit
if current_user.try(:admin?)
@news = News.find(params[:id])
else
flash[:notice] = ‘Nie masz uprawnień do edytowania tego postu !’
redirect_to root_url
end
end

POST /news

POST /news.xml

def create
@news = current_user.news.create(params[:news])

respond_to do |format|
  if @news.save
    format.html { redirect_to(@news, :notice => 'News was successfully created.') }
    format.xml  { render :xml => @news, :status => :created, :location => @news }
  else
    format.html { render :action => "new" }
    format.xml  { render :xml => @news.errors, :status => :unprocessable_entity }
  end
end

end

PUT /news/1

PUT /news/1.xml

def update
@news = News.find(params[:id])

respond_to do |format|
  if @news.update_attributes(params[:news])
    format.html { redirect_to(@news, :notice => 'News was successfully updated.') }
    format.xml  { head :ok }
  else
    format.html { render :action => "edit" }
    format.xml  { render :xml => @news.errors, :status => :unprocessable_entity }
  end
end

end

DELETE /news/1

DELETE /news/1.xml

def destroy
if current_user.try(:admin?)
@news = News.find(params[:id])
@news.destroy

  respond_to do |format|
    format.html { redirect_to(news_index_url) }
    format.xml  { head :ok }
  end
  else
    flash[:notice] = 'Nie masz uprawnień do usunięcia tego postu !'
    redirect_to root_url
end

end
end[/code]
Taki jest kontroler newsów : )

[quote=maciek441][code]news controller

def create
@news = current_user.news.create(params[:news])
(…)[/code]
[/quote]
spróbuj build (http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html)

@news = current_user.news.build(params[:news])

Niestety, nadal nic… : (

  1. Otwórz konsolę rails console
    i sprawdź czy działa ręczne tworzenie newsa:

User.first.news.build(...) n = News.new n.user = User.first itp.
To najprostszy sposób na wybadanie gdzie leży problem.

  1. Zmień tą feralną nazwę modelu News (rzeczownik niepoliczalny) - bardzo często jest to źródłem wielu problemów :wink:

ad. 2 Nie mam pomysłu na jaką zmienić : D Pierwsze co mi na myśl wpadło to właśnie news :wink:
BTW. jak zmienić nazwę modelu?

Przepraszam dopiero się uczę : )

a, rzeczywiście, niepoliczalna nazwa może być problemem. Zmieniasz nazwę klasy i pliku, dodajesz migrację które zmodyfikują bazę, z kluczami obcymi włącznie. Niestety nie ma do tego żadnego generatora. Nazwa – może “Post”? “NewsItem”, “Article”, “NewsArticle” – wybierz sobie, jest dużo opcji.

Nazwa modelu “News” zawsze prowadzi do problemów, prędzej czy później. Nawet jeśli za tym razem sobie z tym poradzisz, i tak natrafisz na coś później i będziesz siedział cztery noce powtarzając sobie “Co ja **** zrobiłem?!”. Mówię to z doświadczenia :wink:

Wkurzyłem się i wygenerowałem nowego scaffold’a o nazwie: Post
a teraz gdy dodaje do posts_controller.rb

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

To wywala mi:

undefined method `posts' for #<User:0x2756e24>

Więc uważam, że jestem coraz bliżej : P

dodaj do user.rb has_many :posts
i do post.rb belongs_to :user
I jedna rada: przeczytaj uważnie od początku do końca te podstawowe poradniki (http://guides.rubyonrails.org/) :wink: Bez tego ani rusz.

[quote=sebcioz]dodaj do user.rb has_many :posts
i do post.rb belongs_to :user
I jedna rada: przeczytaj uważnie od początku do końca te podstawowe poradniki (http://guides.rubyonrails.org/) :wink: Bez tego ani rusz.[/quote]
Przepraszam, właśnie przed chwilą sam się zajechałem, bo zapomniałem o asocjacji : P
Teraz gdy już działa to i tak nie nadaje autora tekstu : )

EDIT:
Przepraszam już mi działa… : )

Dziękuję wszystkim za pomoc i bardzo przepraszam, że aż tak noobie : )

Jeszcze raz dziękuję ! :slight_smile:

[quote=sebcioz]1. Otwórz konsolę rails console
i sprawdź czy działa ręczne tworzenie newsa:

User.first.news.build(...) n = News.new n.user = User.first itp.
To najprostszy sposób na wybadanie gdzie leży problem.[/quote]