Rails - 隐藏的模型属性_Form

时间:2014-01-09 00:36:10

标签: ruby-on-rails

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

2 个答案:

答案 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表单帮助程序将填充先前提交的详细信息。