вопрос новичка: как показать выпадающее меню с помощью этой функции - PullRequest
0 голосов
/ 13 января 2011

Мой объект модели (например, MyObject) имеет одно свойство (например, цвет), свойство "color" содержит строковое значение, которое приходит из списка строк (например, colors=['red','yellow', 'black']).

сейчас, ячтобы один экземпляр myObject был извлечен из базы данных и отображен на странице просмотра в строке, мне нужно показать свойство «color» myObject в раскрывающемся меню с текущим значением в качестве выбранного по умолчанию.Как реализовать это в Rails 3 на моей странице просмотра.

(Позже, когда пользователь выберет из выпадающего меню, объект будет обновлен в БД на основе выбора пользователя)

Пожалуйста, объясните сэкземпляр "myObject" и список "colors = [...]"

Ответы [ 4 ]

1 голос
/ 13 января 2011
# controller (app/controllers/my_objects_controller.rb):
def edit
  @my_object = MyObject.find params[:id]
end
# view (app/views/my_objects/edit.html.erb):
<% form_for @my_object do |f| %>
  <%= f.select :color, MyObject.colors %>
  <%= f.submit %>
<% end %>
0 голосов
/ 13 января 2011

Я использовал помощник формы следующим образом:

select("my_object", "color", your_color_collection, { :include_blank => false }),

НО, когда я нажимаю кнопку сохранения, мой контроллер все еще может получить только значение цвета по умолчанию вместо выбранногоВо-первых, почему ??

Я использую button_to("save", myobject_path(myobject), :method=>:put), который передает объект моему контроллеру.

в сторону моего контроллера, метод обновления:

class MyobjectsController < ApplicationController
...
def update

     @myobject = myobject.find(params[:id])

     if @myobject.update_attributes(params[:myobject])
      puts @myobject.color #always get default value
      redirect_to myobject_path
    else
      redirect_to myobject_path
    end
  end
...
end

Любой можетобъясните мне, почему я всегда получаю значение цвета по умолчанию вместо выбранного?

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

Вы загружаете объект следующим образом:

@my_object = MyObject.find(params[:id], :include => :colors)

Затем в представлении вы можете использовать помощник выбора формы для отображения раскрывающегося списка следующим образом:

<%= f.select :color, @my_object.colors {|c| [c.name, c.id]}, :selected => @my_object.color %>

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

def update
  @my_object = MyObject.find(params[:id])

  respond_to do |format|
    if @my_object.update_attributes(params[:my_object])
      format.html { redirect_to(@my_object) }
      format.xml  { head :ok }
    else
      format.html { render :action => "edit" }
      format.xml  { render :xml => @my_object.errors, :status => :unprocessable_entity }
    end
  end
end
0 голосов
/ 13 января 2011

Пример в haml:

%select{:name => 'color'}
  %option{:value=> @my_object.color}
    = @my_object.color
  -Color::COLORS.each do |c|
    %option{:value=>c.name}
      =h c.name

Предполагается, что у вас есть постоянный список в классе Color модели с именем COLORS, и что вы создали экземпляр @my_object из действия, вызвавшего это представление.

Пример в html.erb (немного ржавый на этом ...):

<select name="color">
    <option value="<%= @my_object.color %>">
        <%= @my_object.color %>
    </option>
    <% Color::COLORS.each do |c| %>
        <option value="<%= c.name %>">
            <%=h c.name %>
        <option>
</select>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...