Как передать значения объекта с помощью render: action => 'new' - PullRequest
0 голосов
/ 25 мая 2010

В приложении у меня есть следующее:

 def new
    @property = Property.new(:country_id => 1, :user_id => current_user.id, :status_id => 'draft')
  end

  def create
    @property = Property.new(params[:property])
      if @property.save
        flash[:success] = t('The_property_is_successfully_created')
        redirect_to myimmonatie_url
      else
        flash.now[:error]=t("The_property_could_not_be_created")
        render :action => 'new'
      end
  end

Когда появляется ошибка, выполняется строка render: action => 'new', но форма my выдает ошибку: бланк пользователя пустой бланк Они не могут быть пустыми (определены в модели), что означает следующий код:

@property = Property.new(:country_id => 1, :user_id => current_user.id, :status_id => 'draft')

больше не выполняется. В чем причина и решение?

UPDATE: Представление очень длинное, но соответствующие строки таковы:

<% form_for :property, @property, :url => { :action => "create" } do |f| %>
<%= f.error_messages( :header_message => nil, :message => nil) %>
    <!--lot's of fields -->
<%- end -%>

Приложение не падает, это сообщения об ошибках, которые показывают поля, которые не могут быть пустыми. Первые 2 ответа уже дали мне причину ошибки: рендер new не выполняет новый метод, поэтому логично, что параметры пусты. Теперь необходимо убедиться, что представление также отображает параметры, которые также установлены в новом методе. Как этого добиться?

Спасибо!

Ответы [ 2 ]

1 голос
/ 25 мая 2010

Ваша проблема здесь, согласно guides.rubyonrails.org, заключается в следующем:

Использование render с: action - частая путаница для новичков Rails. Указанное действие используется для определения того, какое представление следует визуализировать, но Rails не выполняет никакого кода для этого действия в контроллере. Любые переменные экземпляра, которые вам требуются в представлении, должны быть установлены в текущем действие перед вызовом рендера.

Полагаю, это довольно логично, это только рендеринг шаблона, а не выполнение действия. Вы можете попробовать redirect_to, но это, скорее всего, приведет к потере отправленных вами данных.

Попробуйте следующее (обратите внимание, что я на самом деле не запускал этот код, но он выглядит правильно!):

def new
  @property = Property.new(default_params)
end

def create
  @property = Property.new(params[:property].merge(default_params))
  if @property.save
    flash[:success] = t('The_property_is_successfully_created')
    redirect_to myimmonatie_url
  else
    flash.now[:error] = t('The_property_could_not_be_created')
    render :action => 'new'
  end
end

def default_params
  {
    :country_id => 1,
    :user_id => current_user.id,
    :status_id => 'draft'
  }
end
0 голосов
/ 25 мая 2010

Вы правы, код из метода 'new' не выполняется. Когда вы вызываете render: action => 'new', он просто отображает представление для 'new' action (т.е. new.html.erb). Он больше не будет выполнять новый метод.

Однако у вас есть эта строка:

@property = Property.new(params[:property])

Что должно заполнить @property всеми параметрами формы, поэтому форма должна быть заполнена нормально.

Я предполагаю, что ваша начальная форма не является хорошей (форма в new.html.erb). Возможно, вы не правильно заполняете параметры или отправляете их. Можете ли вы опубликовать код new.html.erb?

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