Что не так в этом способе, как леса? - PullRequest
0 голосов
/ 03 апреля 2011

Эй, ребята, я обычно не пользовался эшафотами, хотя довольно долго возился с Rails.Я бы в большинстве случаев делал все вручную.

Теперь я пытаюсь создать спокойную реализацию формы.У меня есть form_for, например:

<% form_for @alliance, :url => create_alliance_path do |f| %>

   <% if @alliance.errors.any? %>  
   <div id="errorExplanation">  
     <h2><%= pluralize(@alliance.errors.count, "error") %> prohibited this user from being saved:</h2>  
     <ul>  
     <% @alliance.errors.full_messages.each do |msg| %>  
       <li><%= msg %></li>  
     <% end %>  
     </ul>  
   </div>  
   <% end %> 

    <%= f.label :name %>
    <%= f.text_field :name %><br>

    <%= f.label :description %>
    <%= f.text_area :description %><br>

    <%= f.label "Image URL" %>
    <%= f.text_field :image_url %><br>

    <%= f.submit "#{t 'alliance.create_button' }" %>

<% end %>

Маршруты:

  scope :path => '/alliances', :controller => :alliances do
    get 'show/(:id)' => :show, :as => 'alliance'
    get 'new' => :new, :as => 'new_alliance'
    post 'create' => :create, :as => 'create_alliance'
  end  

Теперь эта форма генерируется новым действием:

def new
    @alliance = Alliance.new
end

Иотправка выглядит так:

def create
    @alliance = Alliance.new(params[:alliance])

    if @alliance.save
        flash[:error] = I18n.translate 'error.alliance_created'
        redirect_to alliance_path and return
    else
        redirect_to new_alliance_path and return
    end
end 

Теперь, если есть ошибка, я не получаю ее обратно при перенаправлении на new_alliance_path.На первый взгляд это кажется нормальным, поскольку new воссоздает переменную экземпляра @alliance.Однако в некотором коде скаффолдинга кажется, что это делается аналогичным образом.

Вы видите, что я делаю неправильно?

1 Ответ

1 голос
/ 03 апреля 2011

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

def create
    @alliance = Alliance.new(params[:alliance])

    if @alliance.save
        flash[:error] = I18n.translate 'error.alliance_created'
        redirect_to alliance_path
    else
        render :action => :new
    end
end

При вызове перенаправления вы снова запускаете полный жизненный цикл запроса.Вместо этого вы просто хотите перерисовать новое представление с текущим объектом @alliance.

Я также заметил, что вы используете 4 пробела для отступа.Рубиновый стандарт 2.

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