Выпадающие значения Ruby on Rails не сохраняются - PullRequest
1 голос
/ 14 августа 2011

Я новичок в RoR и у меня возникла проблема при попытке сохранить несколько раскрывающихся списков.У меня есть три объекта - книги, жанры и авторы.У объекта книги есть жанр и автор, связанный с ним, но проблема в том, что мне удается сохранить только жанр или автора в моем объекте книги, но не оба.Вот где я нахожусь:

class Author < ActiveRecord::Base
validates :name,  :presence => true
validates :biography,  :presence => true
has_many :books
end

class Genre < ActiveRecord::Base
validates :description,  :presence => true
has_many :books
end

class Book < ActiveRecord::Base
 belongs_to :genre
 belongs_to :author
 has_many :cartitems

validates :name,  :presence => true
validates :price,  :presence => true
validates :description,  :presence => true

end

Контроллер:

def create
#@book = Book.new(params[:book])
@author = Author.find(params[:author].values[0])
@genre = Genre.find(params[:genre].values[0])
@book = @author.books.create(params[:book])
#one or the other saves, but not both
#@book = @genre.books.create(params[:book])
respond_to do |format|
  if @book.save
    format.html { redirect_to(@book, :notice => 'Book was successfully created.') }
    format.xml  { render :xml => @book, :status => :created, :location => @book }
  else
    format.html { render :action => "new" }
    format.xml  { render :xml => @book.errors, :status => :unprocessable_entity }
  end
end

end

Не уверен, поможет ли это или нет, но вот как выглядят выпадающие спискикак в представлении:

<div class="field">
<%= f.label :genre %><br />
<%= @items = Genre.find(:all)
select("genre", "description",  @items.map {|u| [u.description,u.id]}, {:include_blank => true})%>

Цените любую помощь в этом.

РЕДАКТИРОВАТЬ - Вот моя полная форма.

    <%= form_for(@book) do |f| %>
  <% if @book.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@book.errors.count, "error") %> prohibited this book from being saved:</h2>

      <ul>
      <% @book.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :price %><br />
    <%= f.text_field :price %>
  </div>
  <div class="field">
    <%= f.label :description %><br />
    <%= f.text_area :description %>
  </div>
  <div class="field">
    <%= f.label :genre %><br />
    <%= @items = Genre.find(:all)
    select("genre", "description",  @items.map {|u| [u.description,u.id]}, {:include_blank => true})%>
  </div>
  <div class="field">
    <%= f.label :author %><br />
    <%=@items = Author.find(:all)
    select("author", "name",  @items.map {|u| [u.name,u.id]}, {:include_blank => true}) %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Ответы [ 2 ]

1 голос
/ 14 августа 2011

Обновите выбранные поля, чтобы они были определены следующим образом:

<div class="field">
  <%= f.label :genre %><br />
  <%= f.select( :genre_id,  Genre.all.map {|u| [u.description,u.id]}, {:include_blank => true}) %>
</div>
<div class="field">
  <%= f.label :author %><br />
  <%= f.select( :author_id, Author.all.map {|u| [u.name,u.id]}, {:include_blank => true}) %>
</div>

И действие вашего контроллера должно быть таким:

def create
  @book = Book.new(params[:book])
  respond_to do |format|
    if @book.save
      format.html { redirect_to(@book, :notice => 'Book was successfully created.') }
      format.xml  { render :xml => @book, :status => :created, :location => @book }
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @book.errors, :status => :unprocessable_entity }
    end
end

Кроме того, удалите вызовы format.xml , если они вам не нужны, они просто загромождают действие вашего контроллера.

0 голосов
/ 14 августа 2011

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

@book = @author.books.create(:genre => @genre)

Вот еще одно (по сути то же самое):

@book = @author.books.create {|book| book.genre = @genre}

Вы также можете создать экземпляр книги отдельно:

@author = Author.find(params[:author].values[0])
@genre = Genre.find(params[:genre].values[0])
@book = Book.create(:author => @author, :genre => @genre)

Полагаю, вы не совсем правильно построили свою форму, иначе ваш хэш params выглядел бы примерно так {:book => {:author => 1, :genre => 5}}, и вы могли бы сделать это:

@book = Book.create(params[:book])

И вы бы не искали автора, используя params[:author], а вместо этого сделали бы params[:book][:author], если вам вообще нужно было это сделать.

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