我最近完成了Rails教程,现在正在开发我的第一个应用程序。推动混乱的迷雾
我想创建一个附加到用户的“事件”。
def create
@event = current_user.events.build(params[:event])
if @event.save
flash[:success] = "Event created!"
redirect_to events_path
else
@feed_items = []
render 'static_pages/home'
end
end
有了这个,我可以创建一个附加到用户的“事件”,但是当我构建它时,它会将错误的属性(否则)发送给'static_pages / home'。我希望它告诉用户有什么问题,以便他们可以纠正
def create
@event = Event.new(params[:event])
respond_to do |format|
if @event.save
format.html { redirect_to @event, notice: 'Event was successfully created.' }
format.json { render json: @event, status: :created, location: @event }
else
format.html { render action: "new" }
format.json { render json: @event.errors, status: :unprocessable_entity }
end
end
end
通过此设置,我必须指定事件所附加的用户。
如何在将错误发送回表单时自动将事件附加到特定用户的中位数?
由于
大部分代码都是从Rails Tutorial中修改过来的。
答案 0 :(得分:1)
很简单。就像您在第一个示例中将事件范围限定为current_user
一样,在第二个示例中执行相同的操作:
def create
@event = current_user.events.build(params[:event])
respond_to do |format|
if @event.save
format.html { redirect_to @event, notice: 'Event was successfully created.' }
format.json { render json: @event, status: :created, location: @event }
else
format.html { render action: "new" }
format.json { render json: @event.errors, status: :unprocessable_entity }
end
end
end
那就是说,你的设置有些奇怪。一般来说,编写create
动作的惯用方法是创建对象,尝试并保存它。如果成功保存,您将重定向到您希望用户前往的位置。否则,您再次渲染表单。
这对你意味着什么?好吧,使用你的第一个例子:
def create
@event = current_user.events.build(params[:event])
if @event.save
flash[:success] = "Event created!"
redirect_to events_path
else
@feed_items = []
# Change the following line to render the page that the event form is contained at
# This way can render any errors and display the form again
render 'static_pages/home'
end
end
另一方面,您可以使用相同的方法重定向和添加Flash:
flash[:success] = "Event created!"
redirect_to events_path
变为
redirect_to events_path, success: "Event created!"
答案 1 :(得分:1)
您不能只将current_user添加到代码中,如下所示:
def create
@event = current_user.new(params[:event])
respond_to do |format|
if @event.save
format.html { redirect_to @event, notice: 'Event was successfully created.' }
format.json { render json: @event, status: :created, location: @event }
else
format.html { render action: "new" }
format.json { render json: @event.errors, status: :unprocessable_entity }
end
end
end
如果您需要添加feed_items数组,可以这样做:
def create
@event = current_user.new(params[:event])
respond_to do |format|
if @event.save
format.html { redirect_to @event, notice: 'Event was successfully created.' }
format.json { render json: @event, status: :created, location: @event }
else
format.html {
@feed_items = []
render action: "new"
}
format.json { render json: @event.errors, status: :unprocessable_entity }
end
end
end
请注意,redirect_to
会重定向浏览器,您将失去表单参数的范围。 render
不会重定向,而是会告诉控制器呈现“新”视图。 “新”视图包含表单,因此这会将表单保留在范围内,并且Rails表单帮助程序将填充先前提交的详细信息。