当前位置: 首页 > 知识库问答 >
问题:

Rails和验证

濮阳功
2023-03-14

我仍然(对于那些以前帮助过我的人)在验证数据时遇到问题。

场景

我有两个模型-用户和住宿,每个用户有一个住宿(has\u one)。我可以使用current\u user访问登录的用户。

问题所在

当我在注册时验证用户时,一切正常,每个验证规则都会相应地显示验证错误消息。然而,我现在尝试在输入住宿时验证住宿,并得到一个Rails错误页面:

未知操作

找不到住宿控制器的操作“show”

但有趣的是,url已更改为/acculations//edit,似乎缺少住宿id的id(如果一切正常,我确实希望它改为编辑)。

我不认为这是验证规则本身,而是我如何处理重定向(老实说,这让我很困惑!)。如果数据通过验证规则,但不确定如何优雅地处理“非保存”,则数据会正确保存和重定向。

代码

住宿模式

class Accommodation < ActiveRecord::Base
  belongs_to :user

  #validation rules
  validates :user_id, presence: true
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: {    case_sensitive: false }
end

/住宿/新建。html。雇员再培训局

...
<%= form_for :accommodation, url: accommodations_path do |f| %>

<% if @accommodation.errors.any? %>
  <% @accommodation.errors.full_messages.each do |msg| %>
    <p class="error"><%= msg %></p>
  <% end %>
<% end %>

...

住宿控制器(感谢@Depa对此的帮助)

...
def index
  if current_user.accommodation.present?
    redirect_to edit_accommodation_path(current_user.accommodation)
  else
    redirect_to new_accommodation_path(current_user.accommodation)
  end
end

def new
  @accommodation = Accommodation.new
end

def create
  current_user.create_accommodation(accommodation_params)
  flash[:success] = "Accommodation details added"
  redirect_to edit_accommodation_path(current_user.accommodation)
end

def edit
end

def update 
  if @accommodation.update(accommodation_params)
    flash[:success] = "Accommodation details updated successfully"
    redirect_to edit_accommodation_path(@accommodation)
  else
    flash[:error] = "Accommodation details could not be updated"
    render 'edit'
  end
end

private
  def accommodation_params
    params.require(:accommodation).permit(:name, :email)
  end
...

共有2个答案

寿飞飙
2023-03-14

在进入创建时是否实际设置了住宿参数?我希望您需要使用params或params[:住宿]。

否则,create\u accountation调用将失败,这意味着当前用户将失败。住宿将为零,这很可能会导致您的错误。

方增
2023-03-14

要优雅地处理失败的验证,请执行以下操作:

def create
  @accommodation = current_user.build_accommodation(accommodation_params)
  if @accommodation.save
    flash[:success] = "Accommodation details added"
    redirect_to edit_accommodation_path(current_user.accommodation)
  else
    flash.now.notice = "Error creating accommodation"
    render "new"
  end
end
 类似资料:
  • 我对仅使用bcrypt的用户名和密码的用户注册验证有特定要求(没有设计!) 我目前正在工作: 我需要: 用户名: 只能包含字母、数字、短划线和下划线 必须至少包含一个大写字母、一个特殊字符、一个数字和一个小写字母

  • 我刚刚更新到rails 4.0.2,我收到了这个警告: [已弃用]我18n.enforce_available_locales将来会默认为true。如果您真的想跳过区域设置的验证,您可以设置I18n.enforce_available_locales=false以避免此消息。 将其设置为false是否存在任何安全问题?

  • 问题内容: 我正在使用Rails做一个单页应用程序。登录和注销时,使用ajax调用Devise控制器。我遇到的问题是当我1)登录2)退出然后再次登录时不起作用。 我认为这与CSRF令牌有关,该令牌在我退出时会重置(尽管它不应该出现),并且由于它是单页的,因此在xhr请求中发送了旧的CSRF令牌,从而重置了会话。 更具体地说,这是工作流程: 登入 登出 登录(成功201。但是在服务器日志中打印) 后

  • 我有一个带有浮动字段和精度验证的模型。当验证失败但不起作用时,我想显示我自己的自定义错误消息。 根据Rails Gudes的说法,“:消息选项允许您指定验证失败时将添加到错误集合中的消息。当不使用此选项时,活动记录将为每个验证助手使用相应的默认错误消息。:消息选项接受字符串或程序。” 我完全按照这里的例子来做,但它不起作用。 我做错了什么? 这就是我到目前为止学到的。我在测试中将价格设置为空,现在

  • 问题内容: 我想知道如何将node.js集成到Rails应用程序中(出于学习目的)。 基于Michael Hartl教程(http://railstutorial.org/),我实现了带有Rails的基本Twitter克隆,并希望实时获得用户微博,而无需使用彗星或剑圣。(该应用程序托管在heroku上) 目前,我仅看到node.js框架(http://howtonode.org/grasshopp

  • 问题内容: 我使用在WWDC上获得的光盘升级到了雪豹。 现在尝试运行我的一些Rails应用程序会抱怨sql 我本可以发誓我曾经修复过这个问题。问题是 不起作用并给出错误: 有没有人得到mysql在雪豹上使用Rails呢?如果是这样,您的设置是什么,更好的是,我该怎么做才能重现它? 问题答案: 我经历了同样的痛苦…这对我有用: 从mysql.com下载/安装64位MySQL 5.1.37 运行以下命