2013-03-20 115 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 %> 
相关问题