1

레일즈 블로그 (http://www.roberthuberdeau.com/articles/4-How-to-create-a-blog-in-Ruby-on-Rails-3)를 만드는 방법에 대한 튜토리얼을 따라 왔으며 기본적으로 끝까지 다가 왔습니다.레일즈 인스턴스 모델은 콘솔을 통해서만 생성 가능합니다.

그러나 마이그레이션이 끝난 후에 나는 이제 고군분투하고 있습니다. 이전에 기사 작성에 사용한 양식을 완료 할 때마다 색인 페이지에서 볼 수 없습니다. 나는 주변을 파고 오류의 근본 원인은 내가 '기사 작성'을 누를 때 기사를 저장하지 않는다는 것입니다.

이를 테스트하기 위해, 나는 콘솔을 사용하여 기사를 작성하고 그래서 문제가 (이에 해결할 수 기쁘게 생각하지만) 기사와 컨트롤러를 작성하는 양식 사이 어딘가에 자리 잡고 생각해야으로이 나타나고있다.

나는 다음과 같은 로그에 나타납니다 시도 할 때마다 :

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 

제품 모델 :

데이터베이스 스키마와

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) 

그리고 문서를 작성하는 데 사용되는 부분 형태 :

<%= 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 

추신 : 요청에 의해

유일한 다른 오류가 나는 볼 수있다 (그리고 관련이 또는 다른 문제 전체가 나도 몰라) 기사 (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

이 행은 무엇을합니까? '권한! : create, @ article' – Zippie

+0

@ Zippie이 권한이있는 사용자 만이 작업을 수행 할 수 있다는 사실을 (아마도 결함이 있음) 이해하고 있습니까? https : // github에서 그 아이디어를 얻은 곳에서 약간.co.kr/ryanb/cancan/wiki/authorizing-controller-actions –

답변

1

ArticleController.createauthorize! :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

감사합니다. 컨트롤러를 아래와 같이 변경했으며, 번들 설치 및 재시작과 마찬가지로 작동하지 않습니다. 문제의 가능성있는 모델 ... –

+0

이 문제를 일으킬 수도 영향을 미치지 않을 수도있는 또 다른 오류가 있으므로 질문을 다시 편집했습니다. –