Rails - 在不同的控制器/模型中创建和编辑

时间:2013-03-20 00:58:02

标签: ruby-on-rails ruby-on-rails-3 rails-activerecord

我有一个嵌套的评论模型,其中包含与专业,职业和学校的多态关系。我希望用户在他们的节目页面上查看这些专业,学校和职业。此外,我希望他们能够查看他们在个人资料页面上发表的所有评论。

我可以收到要显示的评论,但我在添加,编辑和删除评论时遇到问题,因为我希望他们在看到他们对专业,学校,职业或个人资料的评论时能够执行这些操作页。

以下是我的路线:

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

以下是我的协会:

Major.rb,School.rb,Career.rb

  

has_many:review,as:reviewable

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

1 个答案:

答案 0 :(得分:2)

我明白了。问题在于使用正确的操作和控制器映射正确的实例变量。大多数实例变量都放在我的majors_controller.rb,school_controller.rb和careers_controller.rb show action中。这是我的majors_controller.rb show action 的一部分 - 我错误地将它们放在了创建操作和删除操作中。但是,一旦我坐下来思考它,我意识到这一切都发生在展会页面内。这是我的模型控制器的样子:

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页面中,我可以通过致电给予评论的人来调用show方法:

<%= review.user.profile_name %>

和评论本身:

<%= review.review %>

显示评论。然后我需要创建,编辑和删除。为了创建我只需要让实例变量正确。一旦我在正确的控制器中并且在正确的操作(主要控制器显示动作)下将它们更正,然后在主要显示页面的模态窗口中我调用了部分形式:

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