在Ruby on Rails中传递控制器和视图之间的模型

时间:2012-05-14 13:15:26

标签: ruby-on-rails ruby model-view-controller

我的主屏幕上有注册表格。如果用户输入了无效数据,我会将其重定向到/signin页面。在此页面上,我可以看到填充字段,但错误描述为空。

这是我的UsersController

class UsersController < ApplicationController
  def new
    @user = User.new(params[:user])
  end

  def create
    @user = User.new(params[:user])
    print @user
    if  @user.save

    else
      render 'new'
    end
  end
end

我用来显示错误的方法

module ApplicationHelper

  def errors_for(model, attribute)
    if model.errors[attribute].present?
      content_tag :div, :class => 'well error' do
        content_tag :ul do
          model.errors[attribute].collect {|item| concat(content_tag(:li, item))}

        end
      end
    end
  end
end

我的表格部分:

<%= f.label :user_name %>
<%= f.text_field :user_name, :class=>"input-medium" %>
<%= errors_for(@user, :user_name) %>

<%= f.label :email %>

<%= f.text_field :email, :class=>"input-medium " %>

<%= errors_for(@user, :email) %>

<%= f.label :password %>

<%= f.password_field :password, :class=>"input-medium" %>

<%= f.label :password_confirmation, "Confirmation" %>

<%= f.password_field :password_confirmation, :class=>"input-medium" %>

和我的注册视图:

<section class="centered user-form-container">
  <div class="user-form well pull-left">
    <div class="centered">
      <h1>Sign up</h1>
      <%= form_for(@user, :action=>"create") do |f| %>
          <%= render 'signup', :f=>f %>
          <%= f.submit "Sign up" %>

      <% end %>
    </div>
  </div>

</section>

3 个答案:

答案 0 :(得分:1)

在这种情况下,我认为您需要使用flash.now,如下所示:

根据rails docs

  

默认情况下,向Flash添加值将使它们可用于下一个请求,但有时您可能希望在同一请求中访问这些值。例如,如果创建操作无法保存资源并且您直接呈现新模板,则不会产生新请求,但您可能仍希望使用闪存显示消息。为此,您可以像使用普通闪存一样使用flash.now:

def create
  @user = User.new(params[:user])
  print @user
  if  @user.save

  else
    # start with this, then expand the error text
    flash.now[:error] = "Could not save user"
    render 'new'
  end

end

答案 1 :(得分:1)

您可以在验证方法中执行此操作。

如果您使用的是标准导轨验证,则可以执行以下操作:

validates_presence_of :foo, :message => 'Message you want to display here'

如果您正在进行自定义验证,那么:

def my_validation_method
  begin
    my_validation_code_here
  rescue
    self.errors[:base] << 'Message you want to display here'
  end
end

答案 2 :(得分:1)

  def new
    @user = User.new(params[:user])
    if (!params[:user].nil?)
      @user.valid?
    end


  end