如何使用render传递对象值:action => '新'

时间:2010-05-25 09:22:48

标签: ruby-on-rails

在应用程序中,我有以下内容:

 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

当出现错误时,行渲染:action => 'new'被执行,但我的表单给出了错误: 用户空白 国家空白 这些不能为空(在模型中定义),意思是这段代码:

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

不再执行。原因和解决方案是什么?

更新: 视图很长,但相关的是这些:

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

应用程序不会崩溃,error_messages显示的字段不能为空。 前2个答案已经给出了错误的原因:render new不执行新方法,因此参数为空是合乎逻辑的。现在的目标是确保视图还显示在新方法中也设置的参数。如何实现?

谢谢!

2 个答案:

答案 0 :(得分:1)

根据guides.rubyonrails.org的说法,你的问题是:

使用render with:action是Rails新手的常见混淆源。 指定的操作用于确定要呈现的视图,但Rails不会在控制器中运行该操作的任何代码。必须在视图中设置视图中所需的任何实例变量。调用render之前的当前操作。

我认为这是相当合乎逻辑的,它只是渲染模板,而不是执行动作。您可能想尝试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

答案 1 :(得分:0)

你是对的,方法'new'的代码没有被执行。当你调用render:action =&gt; 'new'它只会呈现'new'动作的视图(即new.html.erb)。它不会再次执行'new'方法。

但是你有这一行:

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

哪个应该填写@property表格中的所有参数,所以表格应该填好。

我的猜测是你的初始形式不好(new.html.erb中的表格)。也许你没有正确地填写params或提交它们。你可以发布new.html.erb代码吗?