【发布时间】:2013-09-03 15:35:55
【问题描述】:
我仍然(对于那些以前帮助过的人)在验证数据时遇到问题。
情景
我有两个模型 - user 和 accommodation,每个用户都有一个住宿 (has_one)。我可以使用 current_user 访问已登录的用户。
问题
当我在注册时验证用户时,一切正常,并为每个验证规则显示相应的验证错误消息。但是,我现在正在尝试在输入住宿时验证住宿,但出现 Rails 错误页面:
未知操作
无法为住宿控制器找到“显示”操作
但有趣的是,url 已更改为 /accommodations//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
/accommodations/new.html.erb
...
<%= 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 %>
...
AccommodationsController(感谢@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
...
【问题讨论】:
标签: ruby-on-rails-3 validation ruby-on-rails-4