Profiles中的NoMethodError显示nil:NilClass

时间:2019-11-27 03:39:07

标签: ruby-on-rails

我目前正在重新设计路线,这导致我的Rails应用程序出现很多错误。我来自

之类的东西
users/:user_id/profiles/id/reviews

/users/:user_id/profile/reviews   

注册后,用户将重定向(redirect_after_sign_up)到个人资料

/users/:user_id/profile/new

用户可以在其中填写表格(允许个人资料使用嵌套属性)

<%= form_for(@user, url: user_profile_path, method: :post) do |form| %>


  <div class="field">
    <%= form.label :street %>
    <%= form.text_area :street %>
  </div>



    <%= fields_for(:profile) do |profile_fields| %>

    <div class="field">
        <%= profile_fields.label :about %>
        <%= profile_fields.text_area :about %>
      </div>

      <div class="field">
        <%= profile_fields.file_field :avatar %>
        <% profile_fields.label "Profile photo" %>
      </div>

  <% end %>



  <div class="actions">
    <%= form.submit "Save your profile", class: "btn btn-default" %>
  </div>

<% end %>

单击提交后,这些数据将不会保存在任何地方。用户也不会被重定向到#show,因为我的个人资料控制器显然存在一些问题。 #show或#create均无效。这是控制器

    class ProfilesController < ApplicationController
  before_action :set_profile, only: [:show, :edit, :update, :destroy]

  def show
    @profile = current_user.profile
    @review = Review.new
    Review.where(profile: @profile) 
  end

  def new
    @user = User.eager_load(:profile).find(params[:user_id])
    @profile = Profile.new
  end

  def edit
    @profile = @user.profile
  end

  def create
    @user = current_user
    @profile = current_user.build_profile(profile_params)

    respond_to do |format|
      if @profile.save
        format.html { redirect_to user_profile_path(current_user.id), notice: 'Profile was successfully created.' }
        format.json { render :show, status: :created, location: @profile }
      else
        format.html { render :new }
        format.json { render json: @profile.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
      if @profile.update(profile_params)
        format.html { redirect_to user_profile_path(current_user.id), notice: 'Profile was successfully updated.' }
        format.json { render :show, status: :ok, location: @profile }
      else
        format.html { render :edit }
        format.json { render json: @profile.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /profiles/1
  # DELETE /profiles/1.json
  def destroy
    @profile.destroy
    respond_to do |format|
      format.html { redirect_to users_url, notice: 'Profile was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private

    def set_profile
      @profile = current_user.profile
    end

    def profile_params
      params.permit(:about, :avatar)
    end

    end

我确实需要调整控制器的帮助,因此它无需profile_id即可工作。这是显示页面,以防万一:

<% if @profile == current_user.profile  %>
    <strong> Welcome </strong><%= current_user.first_name  %>
<% else  %>
    <strong> This is a profile of </strong><%= @profile.user.first_name  %> <%= @profile.user.last_name  %>
<% end  %>


<p>
  <strong>About:</strong>
  <%= @profile.about %>
</p>


    <strong>Profile image</strong>
    <%= image_tag(url_for(@profile.avatar), style: 'width:50px; height:50px;') %>
</p>

<%= render 'reviews/form' %>

<% @reviews.each do |review| %>
    <%= review.user.first_name %> <%= review.user.last_name %> wrote <small> <%= time_ago_in_words(review.created_at) %> ago </small>
    <p>
        <%= review.content %>
        <br>
        <strong> Rating </strong><%= review.rating %>
    </p>
<% end %>

<%= link_to 'Edit', edit_user_profile(current_user.profile) %>
<%= link_to 'Show other profiles', users_path %>


<div class="container">

谢谢。 附言我曾尝试使用ProfileController(单个),但这根本不起作用,因为该应用程序找不到控制器。

更新: 因此,我尝试使用该表单,看起来该表单既不会保存到配置文件,也不会保存到用户。即使我摆脱了嵌套属性,也仍然无法保存。这仍然无法解决...

1 个答案:

答案 0 :(得分:0)

如我所见,您正在使用fields_for,因此请检查发布时发送的结构od参数。我想它们可能看起来像:

user: { :street, profile_attributes: { :about, :avatar } }

,如果是,则需要更改允许的params方法以匹配实际发送的内容。 接下来的建议是在用户模型中添加accepts_nested_attributes_for :profile,并且除了保存用户外,还通过保存个人资料来使用fields_for,因为当前代码有点混乱(form_for用户,其中个人资料的字段导致个人资料控制器)

如果您不想处理嵌套属性,也可以将表单重写为form_for @profile ...