【问题标题】:Rails - Controller Create method not workingRails - 控制器创建方法不起作用
【发布时间】:2018-03-26 11:56:18
【问题描述】:

我正在 Rails 应用程序中创建新用户。我的表单设置好了,现在查看控制器中的方法。这就是我对 new 和 create 操作的要求 -

  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 控制台时,最后一个用户不是我创建的用户。我应该使用其他方法吗?

【问题讨论】:

  • 你一定遇到了一些错误,在 if @user.save 的 else 块中做一个 puts @user.errors 看看你有没有得到任何东西
  • 宁可puts @user.errors.messages :)

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


【解决方案1】:

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

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

【讨论】:

  • 还按照@fool-dev 的建议添加允许的参数
【解决方案2】:

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 的建议检查您允许的参数。

【讨论】:

  • 这无疑让事情向前发展,现在用户*显示中出现“无方法”错误
  • 我已经用更多细节更新了我上面的问题。它在网站上运行,但用户配置文件没有保存到数据库中。
  • 查看@user.errors.full_messages 操作中的@user.errors.full_messages 输出。似乎有一些错误。
【解决方案3】:

您的user_params 缺少passwordpassword_confirmation

会的

 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

应该可以的

【讨论】:

  • @MikeWhitehead 让我们试试解决方案,让我知道发生了什么
猜你喜欢
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多