我仍然(对于那些以前帮助过的人)在验证数据时遇到问题。
情景
我有两个模型 -用户和住宿,每个用户都有一个住宿(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 %>
...
住宿控制器(感谢@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
...