0

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

情景

我有两个模型 -用户住宿,每个用户都有一个住宿(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
...
4

2 回答 2

1

优雅地处理失败的验证:

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
于 2013-09-03T15:50:52.840 回答
0

居然是accommodation_params在入口处设置的create?我希望您需要使用paramsor params[:accommodation]

如果不是,则create_accommodation调用将失败,这意味着current_user.accommodationwill be nil,这很可能会产生您的错误。

于 2013-09-03T15:43:59.480 回答