2013-03-20 136 views
3

我有一個與專業,職業和學校的多態關聯的嵌套評論模型。我希望用戶在他們的展示頁面上查看這些專業,學校和職業。另外,我希望他們看到他們在個人資料頁面上所做的所有評論。Rails - 在不同的控制器/模型中創建和編輯

我可以看到評論,但我在添加,編輯和刪除它們時遇到了問題,因爲我希望他們在看到他們對主要,學校,職業或他們的評論時能夠執行這些操作個人資料頁。

這裏是我的路線:

resources :majors, :schools, :careers do 
    resources :reviews 
end 

這裏是我的協會:

Major.rb,School.rb,Career.rb

的has_many:評論,如:審查的

Review.rb

belongs_to :user 
belongs_to :reviewable, polymorphic: true 

User.rb

的has_many:評論

這裏是我的reviews_controller.rb:

before_filter :reviewable 

def index 
    @reviews = @reviewable.reviews 
    @major = Major.includes(:reviews => :user).find_by_slug(params[:id]) 
end 

def show 
    @review = @reviewable.reviews.find(params[:id]) 
end 

def new 
    @review = @reviewable.reviews.build 
    @review.user = current_user 
end 

def edit 
    @review = @reviewable.reviews.find(params[:id]) 
    raise(ActiveRecord::RecordNotFound, "Access Denied") if @review.user != current_user 
end 

def create 
    @review = @reviewable.reviews.build(params[:review]) 
    @review.user = current_user 
    @reviews = @reviewable.reviews 
end 

def destroy 
    @review = @reviewable.reviews.find(params[:id]) 
    @review.destroy 
    raise(ActiveRecord::RecordNotFound, "Access Denied") if @review.user != current_user 
end 

def reviewable 
    @reviewable = if params[:major_id] 
    Major.find_by_slug!(params[:major_id]) 
    elsif params[:school_id] 
    School.find(params[:school_id]) 
    elsif params[:career_id] 
    Career.find(params[:career_id]) 
    end 
end 

爲了創建,查看和編輯審查例如,一個專業,他們將在主要的展會頁面上進行。這是我對majors_controller.rb:

def show 
    @reviews = Review.includes(:user) 
    @reviews_most_liked = Review.order("created_at DESC").limit(4) 
end 

我想使它這樣他們就可以從一個模式窗口大,學校和職業展示頁面內添加和編輯。這裏是我在模態窗口中的:

<%= simple_form_for([@reviewable, @review]) do |f| %> 
    <%= f.error_notification %> 

    <div class="form-inputs"> 
    <%= f.input :review %> 
    </div> 

    <div class="form-actions"> 
    <%= f.button :submit %> 
    </div> 
<% end %> 

回答

2

我想通了。問題是用正確的操作和控制器映射正確的實例變量。大多數實例變量都放在我的majors_controller.rb,school_controller.rb和careers_controller.rb show action中。這是我majors_controller.rb的一部分顯示操作 - 我錯誤地將它們放置在創建操作和刪除操作中。但是,一旦我坐下來思考,我意識到這一切都發生在演出頁面內。下面是我對我的模型控制器的樣子:

def show 
    @reviewable = @major 
    @reviews = @reviewable.reviews #show reviews 
    @reviews_most_liked = @reviewable.reviews.order("created_at DESC").limit(2) 
    @reviews_most_liked_2 = @reviewable.reviews.order("created_at DESC").limit(2).offset(2) 
    @review = @reviewable.reviews.build(params[:review]) #create a review 
    @review.user = current_user #connect the created review to the user 
end 

然後在我的專業show.html.erb頁,我能夠通過調用誰給了審查者調用顯示方法:

<%= review.user.profile_name %> 

和評論本身:

<%= review.review %> 

顯示評論。然後我需要創建,編輯和刪除。爲了創建我只需要得到實例變量的正確。有一次,我在大滿貫賽的模態窗口讓他們在正確的控制器和正確的動作(專業控制器show動作)下正確的,那麼顯示頁面我打電話的形式分:

<%= render 'reviews/form' %> 

,看起來像這樣:

<%= simple_form_for([@reviewable, @review]) do |f| %> 
    <%= f.error_notification %> 
    <div class="form-inputs"> 
    <%= f.input :review, :input_html => { :class => "span4", :rows => 10 }, 
         label: false, 
       placeholder: 'Help others by sharing what you\'ve learned as a major.' %> 
    </div> 
    <div class="modal-footer"> 
    <button class="btn cancel-modal-review" data-dismiss="modal" aria-hidden="true">Cancel</button> 
    <%= f.submit 'Share My Review', :class => "submit-feedback" %> 
    </div> 
<% end %> 
相關問題