Rails - 控制器创建方法不起作用

时间:2018-03-26 11:56:19

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

我正在使用rails应用程序创建新用户。我已经将表单设置好了,现在查看控制器中的方法。这就是我对新手和创建动作的看法 -

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)

    if @user.save
      redirect_to @user, notice: "Welcome to Safeguarding Monitor."
    else
      render 'new'
    end

  end

这些是用户参数 -

def user_params
  params.require(:user).permit(:firstname, :surname, :nickname, :email, :timezone )
end

当我填写表单时,它只是重定向到新的。它没有保存用户,我似乎无法理解为什么。我已经离开轨道了一段时间,并不能完全解决为什么会发生这种情况。

这是表格 -

<% provide :title, "Add Staff Member" %>

<%= form_for @user do |f| %>

  <div class="form-group row">
    <%= f.label :firstname, 'First Name', class: 'col-sm-2' %>
    <div class="col-sm-10">
      <%= f.text_field :firstname, class: 'form-control' %>
    </div>
  </div>

  <div class="form-group row">
    <%= f.label :nickname, 'Nickname', class: 'col-sm-2' %>
    <div class="col-sm-10">
      <%= f.text_field :nickname, class: 'form-control' %>
    </div>
  </div>

  <div class="form-group row">
    <%= f.label :surname, 'Last Name', class: 'col-sm-2' %>
    <div class="col-sm-10">
      <%= f.text_field :surname, class: 'form-control' %>
    </div>
  </div>

  <div class="form-group row">
    <%= f.label :email, 'Email Address', class: 'col-sm-2' %>
    <div class="col-sm-10">
      <%= f.email_field :email, class: 'form-control' %>
    </div>
  </div>

  <div class="form-group row">
    <%= f.label :email, 'Send Welcome Email?', class: 'col-sm-2' %>
    <div class="col-sm-10">
      <%= check_box_tag :send_welcome_email %>
    </div>
  </div>

  <div class="form-group row">
    <%= f.label :current_school_id, 'School Group', class: 'col-sm-2' %>
    <div class="col-sm-10">
     <%= f.text_field :current_school_id, class: 'form-control' %>
    </div>
  </div>

  <div class="form-group row">
    <%= f.label :timezone, 'Timezone', class: 'col-sm-2' %>
    <div class="col-sm-10">
      <%= f.time_zone_select(:timezone, nil, {default: @user.timezone}, {class: 'form-control custom-select'}) %>
    </div>
  </div>

  <hr>

  <h2>Create Password</h2>

  <p><small>Password must be at least six characters long</small></p>

  <div class="form-group row">
    <%= f.label :password, 'New Password', class: 'col-sm-2' %>
    <div class="col-sm-10">
      <%= f.password_field :password, autocomplete: "off", class: 'form-control' %>
    </div>
  </div>

  <div class="form-group row">
    <%= f.label :password_confirmation, 'Confirm Password', class: 'col-sm-2' %>
    <div class="col-sm-10">
      <%= f.password_field :password_confirmation, autocomplete: "off", class: 'form-control' %>
    </div>
  </div>


  <div class="actions">
    <%= f.submit 'Submit', class: 'btn btn-primary' %>
  </div>
<% end %>

更新 -

我进入了展示页面并得到了一个错误,我似乎已经解决了这个问题 -

def show
      @user = User.find(params[:id])
  end

然而,虽然这种方法似乎解决了网站上的问题。用户配置文件未保存在数据库中,当我检查rails控制台时,最后一个用户不是我创建的用户。我应该使用不同的方法吗?

3 个答案:

答案 0 :(得分:0)

您的password

缺少password_confirmationuser_params

将是

 params.require(:user).permit(:firstname, :surname, :nickname, :email, :timezone,  :password, :password_confirmation) 

像这样更新create方法

def create
    @user = User.new(user_params)
    respond_to do |format|
        if @user.save
            flash[:notice] = 'User was successfully created.'
            format.html { redirect_to user_path(@user) }
        else
            flash[:notice] = 'Something went wrong.'
            format.html { render :action => "new" }
            # or
            # format.html { redirect_to new_user_path }
        end
    end
end

应该有效

答案 1 :(得分:0)

save之后,您必须检查是否有任何错误。

def create
    @user = User.new(user_params)
    @user.save

    unless @user.errors.any?
        #puts @user.errors.full_messages 
        redirect_to @user, notice: "Welcome to Safeguarding Monitor."
    else
        render 'new'
    end
end

检查您允许的参数是否为fool-dev建议。

答案 2 :(得分:0)

可能会出现一些验证错误,因为哪些记录未保存,新页面将再次呈现。

添加代码以在视图上显示验证错误消息,这样您就会知道自己在做什么错误。