2

基本上,我正在处理一个“新列表”表单,无论用户是否登录,它都需要工作 - 所以如果用户没有登录,它会创建一个用户并让他们登录,然后创建关联的清单。我正在使用带有设计的 rails 4,并且真的只需要知道这种情况下的最佳实践是什么,因为它在 Web 应用程序中似乎很常见。

因此,我在列表表单底部的 fields_for :user 标记内有主要用户字段(电子邮件、传递、传递确认),仅在用户未登录时显示。它在列表表单内,所以字段名称采用列表 [用户] [电子邮件] 等形式。我在“列表”控制器中的创建函数目前如下所示:

def create

#if not logged in, create user & sign them in
if !user_signed_in?
  @user = User.new(params[:listing].require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation))
  if @user.save
    sign_in @user
  else
    @listing.errors.add :base, "Invalid user data"
  end
end

 @listing = current_user.listings.build(listing_params)  
 if @listing.save
   redirect_to listing_url(@listing), notice: 'Success! Now, add some images'
 else
   render "new"
 end  
end

只要没有任何验证错误,这一切都可以正常工作。我在想我可以在@listing.errors.add 行之后添加渲染“新”,但这似乎不起作用(仍然给出“@listing = current_user.listings.build(listing_params)”行错误用户尚未创建/登录。如果我输入所有用户字段,则用户已成功创建并登录,因此它正确显示了正常的列表验证错误。

无论如何,对于我是否朝着正确的方向前进,我只是有点迷茫——有人可以阐明如何让这个过程“按轨道”工作吗?谢谢你的帮助!

4

1 回答 1

0

您快到了。在您的问题中,您说添加该行render "new"没有帮助。嗯,那是因为它在该行之后继续执行函数的其余部分。你想要做的是立即退出,所以你没有打线@listing = current_user.listings.build(...)

您想要render "new" and returnafter @listing.errors.add :base, ...,以便它在看到用户无效时立即离开操作。

于 2013-09-01T21:26:07.207 回答