我目前正在重新设计路线,这导致我的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(单个),但这根本不起作用,因为该应用程序找不到控制器。
更新: 因此,我尝试使用该表单,看起来该表单既不会保存到配置文件,也不会保存到用户。即使我摆脱了嵌套属性,也仍然无法保存。这仍然无法解决...
答案 0 :(得分:0)
如我所见,您正在使用fields_for
,因此请检查发布时发送的结构od参数。我想它们可能看起来像:
user: { :street, profile_attributes: { :about, :avatar } }
,如果是,则需要更改允许的params方法以匹配实际发送的内容。
接下来的建议是在用户模型中添加accepts_nested_attributes_for :profile
,并且除了保存用户外,还通过保存个人资料来使用fields_for
,因为当前代码有点混乱(form_for用户,其中个人资料的字段导致个人资料控制器)
如果您不想处理嵌套属性,也可以将表单重写为form_for @profile ...