向用户添加图像的问题

时间:2018-04-10 16:32:21

标签: ruby-on-rails ruby

当我在_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

1 个答案:

答案 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将在那里被召唤。你确定要的吗?