繁体   English   中英

Rails - 隐藏的模型属性_Form

[英]Rails - Hidden Model Attributes _Form

我最近完成了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教程中修改的。

很简单。 就像在第一个示例中将事件范围current_usercurrent_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!"

你不能只是将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表单帮助程序将填充先前提交的详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM