当我在_form中按下提交按钮时,应创建图像并将其链接到用户,但出现了问题。我对广告使用相同的图像模型,几乎相同的代码工作正常。也许这个问题可能与设计用户控制器和我的用户控制器的不一致有关?
用户控制器
class UsersController < ApplicationController
before_action :set_user, only: [:show, :edit, :update, :destroy]
def index
end
def show
end
def new
@user = User.new
@user.images.build
end
def edit
authorize! :update, @user
@user.images.build
end
def create
@user = current_user
respond_to do |format|
if @user.save
format.html { redirect_to board_url }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new }
format.json { render json: @user.errors, status: :unprocessable_entity}
end
end
end
def update
respond_to do |format|
if @user.update(user_params)
format.html { redirect_to board_url }
format.json { render :show, status: :ok, location: @user }
else
format.html { render :edit }
format.json { render json: @user.errors, status: :unprocessable_entity}
end
end
end
def destroy
authorize! :update, @user
@user.destroy
respond_to do |format|
format.html { redirect_to board_url }
format.json { head :no_content }
end
end
private
def set_user
@user = User.find(params[:id])
end
def user_params
params.require(:user).permit(:email, images_attributes: [:id, :name])
end
end
_form
<%= form_with(model: user, local: true) do |form| %>
<%= form.fields_for :images do |image| %>
<div class="image_fields">
<div class="field">
<%= image.label t('.img_name') %><br>
<%= image.text_field :name %>
</div>
</div>
<% end %>
<div class="actions">
<%= form.submit %>
</div>
<% end %>
类图片
class Image < ApplicationRecord
belongs_to :ad
belongs_to :user
validates :name, presence: true
...
类用户
class User < ApplicationRecord
has_many :ads
has_many :images, dependent: :destroy
accepts_nested_attributes_for :images,
reject_if: proc { |attributes| attributes['name'].blank? },
allow_destroy: true
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
end
迁移
class AddUserIdToImages < ActiveRecord::Migration[5.1]
def change
add_column :images, :user_id, :integer
end
end
class CreateImages < ActiveRecord::Migration[5.1]
def change
create_table :images do |t|
t.string :name
t.references :ad, foreign_key: true
t.timestamps
end
end
end
答案 0 :(得分:0)
请提供错误消息和回溯。
我认为这是因为&#34; ad&#34;对于用户,引用是空白的。 根据你的代码:
t.references :ad, foreign_key: true
所以我认为问题出在数据库约束上 最简单的解决方案是将其更改为
add_column :images, :ad_id, :integer
没有外键。
或者就您而言,您可以添加polimorhic association
此外,一个与该主题无关的问题,但想问一下
respond_to do |format|
if @user.save
format.html { redirect_to board_url }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new }
format.json { render json: @user.errors, status: :unprocessable_entity}
end
end
为什么要在respond_to
方法中保存?
所以在rails深度中,有一种方法:
def respond_to(&block)
...
block.call
...
end
你的@user.save
将在那里被召唤。你确定要的吗?