2017-10-08 48 views
0

我通過Rails教程(http://guides.rubyonrails.org/getting_started.html)去創造一個物品模型。我沒有將評論部分添加到我的應用程序中。我設立了Devise來處理用戶。不能使後在文章的時候我添加belongs_to的:用戶/app/models/article.rb

這種運作良好,用戶可以創建,編輯和破壞對方的職位。我現在想讓用戶只編輯或刪除自己的文章帖子。

我做了一些改變,我得到一個錯誤「用戶必須存在」當任何用戶嘗試創建文章後。我注意到,添加belongs_to:用戶是什麼造成這個錯誤。有沒有辦法來解決這個問題?

我添加了一個參考和外鍵:

rails g migration AddUserToUploads user:references 

那麼我確信我這個遷移:

class AddUserToArticles < ActiveRecord::Migration[5.0] 
    def change 
    add_reference :articles, :user, foreign_key: true 
    end 
end 

我說'belongs_to的:用戶到應用程序/模型/ article.rb所以它看起來像:

class Article < ApplicationRecord 
    validates :title, presence: true, 
        length: { minimum: 5 } 

    belongs_to :user 

end 

我的應用程序/模型/ user.rb看起來像現在這樣:

class User < ApplicationRecord 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :lockable, :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    has_many :articles 
end 

我暫時不能在我的意見的任何用戶限制。

我articles_controller.rb設置是這樣的:

class ArticlesController < ApplicationController 

    def index 
    @articles = Article.all 
    if params[:search] 
     @articles = Article.search(params[:search]).order("created_at DESC") 
    else 
     @articles = Article.all.order('created_at DESC') 
    end 
    end 

    def show 
    @article = Article.find(params[:id]) 
    end 

    def new 
    @article = Article.new 
    end 

    def edit 
    @article = Article.find(params[:id]) 
    end 

    def create 
    @article = Article.new(article_params) 
    if @article.save 
     redirect_to @article 
    else 
     render 'new' 
    end 
    end 

    def update 
    @article = Article.find(params[:id]) 

    if @article.update(article_params) 
     redirect_to @article 
    else 
     render 'edit' 
    end 
    end 

    def destroy 
    @article = Article.find(params[:id]) 
    @article.destroy 

    redirect_to articles_path 
    end 

    private 
    def article_params 
     params.require(:article).permit(:title, :text, :description, :keyword, :syntax, :programlang) 
    end 

我試圖改變的破壞方法這一點,但它仍然沒有做任何事情:

def destroy 
    @article = Article.find(params[:id]) 
    if user_signed_in? && current_user.articles.exists?(@article.id) 
     @article.destroy 
    else 
     redirect_to articles_path 
    end 
    end 

我缺少的東西?我需要對我的文章做些什麼改變?

+0

用戶可以創建一個沒有被登錄的文章? –

+0

不,我仍然有一些事情受到限制。設計是處理認證。當我添加belongs_to:user時,我發現問題發生。 –

+0

當您嘗試在「Article」中維護關聯時,您在「上傳」中添加了參考。你的'article'實際上是否有user_id字段? – kiddorails

回答

0

您可以嘗試在你的控制器的頂部有這樣多before_action S:

class ArticlesController < ApplicationController 
    before_action :authenticate_user! 
    before_action :set_post,   only: [:edit, :update, :destroy] 
    before_action :check_post_owner, only: [:edit, :update, :destroy] 

    def edit 
    # just leave this blank - it's fine 
    end 

    def update 
    if @article.update(article_params) 
     redirect_to @article 
    else 
     render 'edit' 
    end 
    end 

    def destroy 
    @article.destroy 
    redirect_to articles_path 
    end 

    private 

    def set_post 
    @article = Article.find(params[:id]) 
    end 

    def check_post_owner 
    if @article.user != current_user 
     flash[:notice] = "You're not the owner" 
     redirect_to articles_path 
    end 
    end 

end 

:authenticate_user!是設計方法。 set_postcheck_post_ownerprivate段內的自定義方法。

您也可以通過創建方法重構@article = Article.find(params[:id])行,並從before_action中調用它,如在我的set_post方法中。

0

在Rails 5,你需要添加所需= false以你的孩子模式,允許創建子記錄時,你不通過關聯方法

class Article < ApplicationRecord 
    validates :title, presence: true, 
       length: { minimum: 5 } 

    belongs_to :user, required: false 

end 

乾杯創建子記錄!

相關問題