在应用程序中,我有以下内容:
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不执行新方法,因此参数为空是合乎逻辑的。现在的目标是确保视图还显示在新方法中也设置的参数。如何实现?
谢谢!
答案 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代码吗?