błąd przy zapisie do bazy

Witam. Dopiero co zaczynam swoją przygodę z RoR dlatego pytanie bedzie pewnie banalne. Tworze aplikację w RoR 2.1.2 podpiętą pod bazę Oracle 10g XE. Dostęp i konfiguracja w pliku yml są ok gdyż migracja przebiegła ok. Posiadam tam tabelę cities o polach id, name i zip. Kontroler napisany na podstawie tutoriala wygląda następująco:

class CityController < ApplicationController def list @cities = City.find(:all) end def show @city = City.find(params[:id]) end def new @city = City.new end def create @city = City.new(params[:city]) if @city.save redirect_to :action =>'list' else redirect_to :action => 'write_error' end end def edit @city = City.find(params[:id]) end def update @city = City.find(params[:id]) if @city.update_attributes(params[:city]) redirect_to :action => 'show', :id => @city end end def delete City.find(params[:id]).destroy redirect_to :action => 'list' end def write_error end end
a plik widoku dla metody new:

[code]

Dodaj miasto


<% form_tag :action => ‘create’ do %>

Miasto: <%= text_field 'city', 'name' %>

Kod pocztowy: <%= text_field 'city', 'zip' %>

<%= submit_tag "Create" %> <% end %> <%= link_to 'Wstecz...', {:action => 'list'} %>[/code] Po wprowadzeniu danych i zatwierdzeniu w bazie nie pojawia sie nic nowego :( prosze o pomoc i z gory dziekuje :)

Pokaż logi.

Po wywołaniu @city.save, wypisz sobie @city.errors.inspect, to zobaczysz dlaczego nie chciało się zapisać

Wywołaj @city.save! , wtedy jeśli zapis się nie powiedzie aplikacja rzuci wyjątkiem i dostaniesz do poczytania pełny komunikat błędu oraz backtrace.

dzieki za info - juz znalazlem przyczyne :slight_smile: dalem walidacje na pole id w modelu - glupi blad :confused:

Mam problem z zapisywaniem do bazy. Mój widok wygląda tak: [code]<%= error_messages_for :message %>

			<h2>Poczta</h2>
		</div></br>
		<% form_for :message do |f| %>
		<div>
			<%= f.text_area :content, :size => '25' %></br>
			<%= link_to 'Wyślij', :controller => 'messages', :action => 'create' %>
		</div>
                    <% end %>
	</div>
</div>[/code]

Kontroler tak: [code] class MessagesController < ApplicationController

def new
@message = Message.new
end

def create
@message = Message.new(params[:message])
#@message.sender = current_user

if @message.save
  flash[:notice] = @message.errors.inspect
  redirect_to "http://localhost:3000/home/index/"
else
  render :action => 'new'
end

end
end[/code]
i oczywiście mam tabele messages, a w niej pole ‘content’ typu text. gdy zapisuje jakis tekst do bazy, pojawia mi się nowy rekord, ale w polu ‘content’ nie ma tego tekstu. Czy ktoś wie o co chodzi?

  1. Nie <%= link_to 'Wyślij', :controller => 'messages', :action => 'create' %>
    tylko <%= f.submit 'Create!' %>
  2. Zamiast redirect_to "http://localhost:3000/home/index/"
    radzę używać ścieżek względnych (tych generowanych automatycznie, typu home_path), ew zapisu redirect_to :controller => "home"

Oraz rzecz, która przyda Ci się na przyszłość:

Zakładam, że w modelu User masz has_many :messages, a w modelu Message belongs_to :user. Wtedy zamiast

[code “ruby”] def create
@message = Message.new(params[:message])
#@message.sender = current_user

if @message.save
#...[/code]

dajesz:

[code “ruby”] def create
@message = current_user.messages.build(params[:message])

if @message.save
#...[/code]

Po to właśnie są te wszystkie powiązania :wink:

sebcioz, to co mi napisałeś nie działa u mnie… jak zmieniłem tak jak napisałeś to w ogole już nawet rekordu nie tworzy…
rav, a czy konieczne są powiązania w modelach zeby działało te zapisywanie wiadomości do bazy danych?

Ponawiam swoją prośbę. Próbowałem różnych rzeczy ale nadal nie chce mi to działać. Pojawia się nowy rekord i jego id, ale wartości content nie zapisuje do bazy. Mam jeszcze model ‘message.rb’ w którym nic nie ma.
Kontroler: [code]class MessagesController < ApplicationController

def new
@message = Message.new
end

def create
@message = Message.new(params[:message])

if @message.save
  flash[:notice] = 'Wiadomosc zostala wyslana'
  redirect_to :controller => 'message'
else
  render :action => 'new'
end

end
end[/code]
Widok: [code]<%= error_messages_for :message %>

            <h2>Poczta</h2>
        </div></br>
        <% form_for :message do |f| %>
        <div>
            <%= f.text_area :content, :size => '25' %></br>
            <%= link_to 'Wyślij', :controller => 'messages', :action => 'create' %>
        </div>
                    <% end %>
    </div>
</div>[/code]

To jest źródłem Twojego problemu:

                <%= link_to 'Wyślij', :controller => 'messages', :action => 'create' %>

Nie mam ochoty odrabiać za Ciebie pracy domowej, więc tak na szybko zamień to na <%= submit_tag “Wyślij” %>. Zadziała. A potem doczytaj dlatego link (a href) nie wysyła zawartości formularza i dlaczego robi to submit button.