1

我一直在關注創建Rails博客(http://www.roberthuberdeau.com/articles/4-How-to-create-a-blog-in-Ruby-on-Rails-3)的教程,並基本上一路走到最後。只能通過控制檯創建的Rails模型實例

但是,在我現在正在掙扎的所有遷移之後。每當我完成我以前用來創建文章的表單時,我都無法在索引頁上看到它們。我已經挖出並相信錯誤的根源在於,當我按下「創建文章」時,我沒有保存任何文章。

爲了測試這個,我使用控制檯創建了一篇文章,並且這是應該出現的,所以我認爲問題在於創建文章和控制器的表單之間(儘管我很樂意在此處進行更正)。

每當我試着在日誌中出現以下內容:

Started POST "/articles" for 127.0.0.1 at 2013-04-01 21:12:58 +0100 
Processing by ArticlesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"XLeHm+4Tgd6n9vt4RxAQ5YVTbWTi+UnqkmBso9Iuo+4=", "article"=>{"title"=>"I rule", "body"=>"Change teams.", "tag_names"=>"kill", "published"=>"1"}, "commit"=>"Create Article"} 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 
    Role Load (0.1ms) SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles"."id" = "roles_users"."role_id" WHERE "roles_users"."user_id" = 1 AND "roles"."name" = 'Admin' LIMIT 1 
    Role Load (0.1ms) SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles"."id" = "roles_users"."role_id" WHERE "roles_users"."user_id" = 1 AND "roles"."name" = 'Moderator' LIMIT 1 
    Role Load (0.1ms) SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles"."id" = "roles_users"."role_id" WHERE "roles_users"."user_id" = 1 AND "roles"."name" = 'Member' LIMIT 1 
Redirected to http://localhost:3000/ 
Completed 302 Found in 5ms (ActiveRecord: 0.5ms) 

隨着數據庫模式:

ActiveRecord::Schema.define(:version => 20130401171646) do 

    create_table "articles", :force => true do |t| 
    t.string "title" 
    t.text  "body" 
    t.datetime "created_at",     :null => false 
    t.datetime "updated_at",     :null => false 
    t.integer "user_id",      :null => false 
    t.boolean "published", :default => false 
    end 

    create_table "comments", :force => true do |t| 
    t.integer "article_id" 
    t.string "name" 
    t.string "email" 
    t.text  "body" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 

    create_table "roles", :force => true do |t| 
    t.string "name" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 

    create_table "roles_users", :id => false, :force => true do |t| 
    t.integer "role_id" 
    t.integer "user_id" 
    end 

    create_table "taggings", :force => true do |t| 
    t.integer "article_id" 
    t.integer "tag_id" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 

    create_table "tags", :force => true do |t| 
    t.string "name" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 

    create_table "users", :force => true do |t| 
    t.string "email",     :default => "", :null => false 
    t.string "encrypted_password",  :default => "", :null => false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   :default => 0 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at",        :null => false 
    t.datetime "updated_at",        :null => false 
    end 

    add_index "users", ["email"], :name => "index_users_on_email", :unique => true 
    add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true 

end 

文章控制器:

class ArticlesController < ApplicationController 
    before_filter :authenticate_user!, :except => [:index, :show] 
    # GET /articles 
    # GET /articles.xml 
    def index 
    @articles = Article.published.page(params[:page]).per(5).ordered 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @articles } 
    end 
    end 

    # GET /articles/1 
    # GET /articles/1.xml 
    def show 
    @article = Article.find(params[:id]) 
    @comment = Comment.new(:article=>@article) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @article } 
    end 
    end 

    # GET /articles/new 
    # GET /articles/new.xml 
    def new 
    @article = Article.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @article } 
    end 
    end 

    # GET /articles/1/edit 
    def edit 
    @article = Article.find(params[:id]) 
    authorize! :edit, @article 
    end 

    # POST /articles 
    # POST /articles.xml 
    def create 
    authorize! :create, @article 
    @article = Article.new(params[:article]) 
    @article.user_id = current_user.id 

    respond_to do |format| 
     if @article.save 
     format.html { redirect_to(@article, :notice => 'Article was successfully created.') } 
     format.xml { render :xml => @article, :status => :created, :location => @article } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @article.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /articles/1 
    # PUT /articles/1.xml 
    def update 
    @article = Article.find(params[:id]) 
    authorize! :update, @article 
    respond_to do |format| 
     if @article.update_attributes(params[:article]) 
     format.html { redirect_to(@article, :notice => 'Article was successfully updated.') } 
     format.xml { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @article.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /articles/1 
    # DELETE /articles/1.xml 
    def destroy 
    @article = Article.find(params[:id]) 
    authorize! :destroy, @article 
    @article.destroy 

    respond_to do |format| 
     format.html { redirect_to(articles_url) } 
     format.xml { head :ok } 
    end 
    end 


end 

文章型號:

class Article < ActiveRecord::Base 
    attr_accessible :body, :title, :tag_names 
    has_many :comments, :dependent => :destroy 
    has_many :taggings, :dependent => :destroy 
    has_many :tags, :through => :taggings 
    validates_presence_of :title, :body 
    validates_uniqueness_of :title 
    attr_writer :tag_names 
    after_save :assign_tags 
    validates_numericality_of :user_id 
    belongs_to :user 
    scope :published, lambda {{:conditions => ['published = ?', true]}} 
    scope :ordered, lambda {{:order => "Created_at DESC" }} 
    def tag_names 
    @tag_names || tags.map(&:name).join(' ') 
    end 

    private 

    def assign_tags 
    if @tag_names 
     self.tags = @tag_names.split(/\,/).map do |name| 
     Tag.find_or_create_by_name(name) 
     end 
    end 
    end 
end 

,並用於創建文章的形式分:

<%= form_for(@article) do |f| %> 
    <% if @article.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@article.errors.count, "error") %> prohibited this article from being saved:</h2> 

     <ul> 
     <% @article.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :title %><br /> 
    <%= f.text_field :title %> 
    </div> 
    <div class="field"> 
    <%= f.label :body %><br /> 
    <%= f.text_area :body %> 
    </div> 
    <div class="field"> 
    <%= f.label :tag_names, "Tags" %> 
    <%= f.text_field :tag_names %> 
    </div> 
    <div class="field"> 
    <%= check_box("article", "published") %> 
    <%= "Publish article" %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

任何幫助,您可以給我在這,將不勝感激。

通過請求:

Ability.rb

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user 

    if user.role? :Admin 
     can :manage, :all 
     can :publish, Article 
    elsif user.role? :Moderator 
     can :read, [Article, Comment] 
     can [:edit, :update], Comment 
    elsif user.role? :Member 
     can :read, :all 
     can :create, [Article, Comment] 
     can [:edit, :update], Comment 
    end 
    end 
end 

P.S.唯一的其他錯誤,我可以看到(我不知道這是否是相關的或者不同的問題完全)是試圖查看的文章(show.html.erb)我收到以下錯誤時:

Processing by ArticlesController#show as HTML 
    Parameters: {"id"=>"1"} 
    Article Load (0.2ms) SELECT "articles".* FROM "articles" WHERE "articles"."id" = ? LIMIT 1 [["id", "1"]] 
Completed 500 Internal Server Error in 44ms 

ActiveModel::MassAssignmentSecurity::Error (Can't mass-assign protected attributes: article): 
    app/controllers/articles_controller.rb:18:in `new' 
    app/controllers/articles_controller.rb:18:in `show' 
+0

這條線做什麼? '授權! :創造,@文章' – Zippie

+0

@ Zippie我的(也許有缺陷)的理解是,這隻允許授權用戶執行此操作?關於從https:// github獲得該想法的一點點。com/ryanb/cancan/wiki/authorizing-controller-actions –

回答

1

我在ArticleController.create中的authorize! :create, @article行猜測存在問題。在執行時,@article尚未創建。

由康康舞源來看,我覺得有以下可能會做你想要什麼:

def create 
    authorize! :create, Article 
    @article = Article.new(params[:article]) 
    @article.user_id = current_user.id 
    ... 
+0

感謝您快速回復我 - 我剛剛提出了您建議的更改,我擔心它沒有奏效,我會仔細查看CanCan現在記錄下來,看看我可能會出錯的地方。 –

+0

好的。我認爲另一種更可能行得通的方法是移動'授權! :在'@article.user_id = current_user.id'之後創建,@ article'行。這樣它就有了要授權的模型實例。 –

+0

嗯,我改變了順序,使它去了: '@article = Article.new(params [:article])' '@article.user_id = current_user.id' 'authorize! :創建,@文章' 但這也行不通。惡夢。 (貌似我們在想同一件事!) –

0

的文章,因爲這沒有被創建。

authorize! :create, @article

你必須向我們展示你的能力模型,ability.rb。

你可能也想嘗試一下顯而易見的。 bundle install並重新啓動服務器。

+0

謝謝,我已經按照下面的方式更改了控制器,並且它沒有工作,與'bundle install'一樣並重新啓動。 有問題的能力模型... –

+0

已編輯該問題,因爲還有另一個錯誤可能導致或可能不會導致/影響此問題。 –

相關問題