2012-03-26 2 views
0

저는 Rails를 처음 사용하고 대학생 (교사 및 학생)이 게시물을 작성하고 의견을 작성할 수있는 응용 프로그램을 작성합니다. 나중에 중첩 (조상)과 점 시스템을 추가하고 싶습니다.form_for 태그 및 중첩 된 양식 - 컨트롤러의 사용자 정의 메서드 사용

게시물, 댓글 및 회원 모델이 있습니다. Post 모델은 Scaffolding을 통해 만들어졌으며 Member 모델은 Devise의 도움을 받아 만들어졌으며 Comment는 단순한 모델입니다.

게시물의 내 ​​페이지에서 게시물 아래에 댓글을 달고 싶습니다. 약간의 진전을 보였습니다. (덕분에 꽤 많이 알게되었습니다.)하지만 지금은 언제든지 문제가 붙어 있습니다. 레일즈가 편집 페이지로 리디렉션하고있는 빈 코멘트를 게시하려고 시도했습니다. 레일을 쇼 페이지에서만 유지하고 오류를 표시하도록 이것을 변경하는 방법은 무엇입니까?

이 기사에서는 post_controller.rb에서 'update_comments'라는 새 메서드를 만들고 아래 코드에서 forms_for 태그 특성을 수정하려고 시도했지만 제출할 때 라우팅 오류가 발생합니다.

응용 프로그램/모델/member.rb

class Member < ActiveRecord::Base 
    #Associations 
    belongs_to :department 

    has_one :student, :dependent => :destroy 
    accepts_nested_attributes_for :student 

    has_one :nstudent, :dependent => :destroy 
    accepts_nested_attributes_for :nstudent 

    has_many :posts, :dependent => :destroy 
    has_many :comments, :dependent => :destroy 
end 

응용 프로그램/모델/post.rb

class Post < ActiveRecord::Base 

    #Associations 
    belongs_to :member 
    has_many :comments, :dependent => :destroy 

    accepts_nested_attributes_for :comments 
end 

응용 프로그램/모델/comment.rb

class Comment < ActiveRecord::Base 

    # Associations 
    belongs_to :member 
    belongs_to :post 

    validates_presence_of :content 
end 

설정/경로. rb

Urdxxx::Application.routes.draw do 
    devise_for :members 

    resources :posts do 
    member do 
    get 'update_comment' 
    end 
    end 

    root :to => 'posts#index' 
을 만들기에 http://i.stack.imgur.com/TBgKy.png

:

응용 프로그램/컨트롤러/posts_controller.rb

class PostsController < ApplicationController 
    # Devise filter that checks for an authenticated member 
    before_filter :authenticate_member! 

# GET /posts 
# GET /posts.json 
def index 
    @posts = Post.find(:all, :order => 'points DESC') 

    respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @posts } 
    end 
end 
... 
# GET /posts/1/edit 
def edit 
    @post = Post.find(params[:id])  
end 

# POST /posts 
# POST /posts.json 
def create 
    @post = Post.new(params[:post]) 
    @post.member_id = current_member.id if @post.member_id.nil? 

    respond_to do |format| 
    if @post.save 
     format.html { redirect_to @post, notice: 'Post was successfully created.' } 
     format.json { render json: @post, status: :created, location: @post } 
    else 
     format.html { render action: "new" } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
    end 
    end 
end 

# PUT /posts/1 
# PUT /posts/1.json 
def update 
    @post = Post.find(params[:id]) 

    respond_to do |format| 
    if @post.update_attributes(params[:post]) 
     format.html { redirect_to @post, notice: 'Post was successfully updated.' } 
     format.json { head :no_content } 
    else 
     format.html { render action: "edit" } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
    end 
    end 
end 

# DELETE /posts/1 
# DELETE /posts/1.json 
def destroy 
    @post = Post.find(params[:id]) 
    @post.destroy 

    respond_to do |format| 
    format.html { redirect_to posts_url } 
    format.json { head :no_content } 
    end 
end 

# Not made by scaffold 
def update_comment 
    @post = Post.find(params[:id])   

    respond_to do |format| 
    if @post.update_attributes(params[:post]) 
     format.html { redirect_to @post, notice: 'Comment was successfully created.' } 
     format.json { head :no_content } 
    else 
     format.html { render action: "show" } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
    end 
    end 
end 
end 

응용 프로그램/조회/게시물/show.html.erb

<p> Have your say </p> 
<%= form_for @post, :url => {:action => 'update_comment'} do |p| %> 
    <%= p.fields_for :comments do |c| %> 
    <!-- Following 3 lines saved my life --> 
     <% if c.object.new_record? %> 
     <%= c.text_area :content, :rows => 4 %> 
     <%= c.hidden_field :member_id, value: current_member.id %> 
     <% end %> 
    <% end %> 
    <%= p.submit "Reply" %> 
<% end %> 

내 공연 페이지의 이미지 댓글 : http://i.stack.imgur.com/JlWeR.png

업데이트 :

Ken이 말한 것을 뒤돌아 보아 여기에서 변경했습니다. 나는 그것이 어떻게 작동하는지 모르지만 지금은 효과가있다.

응용 프로그램/컨트롤러/posts_controller.rb는

def update 
    @post = Post.find(params[:id]) 

    respond_to do |format| 
    if @post.update_attributes(params[:post]) 
    format.html { redirect_to @post, notice: 'Post was successfully updated.' } 
    format.json { head :no_content } 
    elsif :comments 
    format.html { render action: "show" } 
    format.json { render json: @post.errors, status: :unprocessable_entity } 
    else 
    format.html { render action: "edit" } 
    format.json { render json: @post.errors, status: :unprocessable_entity } 
    end 
    end 
end 

답변

0

는 사용자 지정 방법이 필요하지 않습니다. 그것은 매우 RESTful하지 않습니다. REST에 대한 정보는 예 : http://www.sitepoint.com/restful-rails-part-i/을 참조하십시오. 이는 맞춤법을 사용하는 것이 정당한 경우가 아닙니다.

사용자 정의 메서드를 추가 할 때마다 필요 여부를 길고 열심히 생각해야합니다.일반적으로 사용자 정의 방법이 필요한 경우 다른 컨트롤러 (또는 다른 컨트롤러 세트)가 실제로 필요합니다.

여기에서 업데이트 방법 만 있으면됩니다. 실패한 업데이트 후에 show 메서드로 이동하려면 (이유는 모르겠지만) 업데이트가 실패한 후 update 메서드의 블록에서 render edit 호출을 변경하십시오.

편집보기가 오류를 표시하지 않는 것이 실제 문제 인 것 같습니다. scaffold가 생성 한 뷰는이를 수행해야하지만 아마 그것을 변경했을 것입니다.

경우

당신은 그것을 당신이 스크린 캐스트 혜택을 누릴 수 있습니다 놓친 :

http://railscasts.com/episodes/196-nested-model-form-part-1

0

당신은 경로에서 메소드 유형을 업데이트해야하며 필요하면이 후 양식에게 그것을 제출할 때 또한, 새로운 행동 양식 포스트 방법을 설정합니다 요청하지 요청하십시오.

Urdxxx::Application.routes.draw do 
    devise_for :members 

    resources :posts do 
    collection do 
    post :update_comment 
    end 
    end 

    root :to => 'posts#index' 

<p> Have your say </p> 
<%= form_for :post, :url => {:action => 'update_comment'} do |p| %> 
    <%= p.fields_for :comments do |c| %> 
    <!-- Following 3 lines saved my life --> 
     <% if c.object.new_record? %> 
     <%= c.text_area :content, :rows => 4 %> 
     <%= c.hidden_field :member_id, value: current_member.id %> 
     <% end %> 
    <% end %> 
    <%= p.submit "Reply" %> 
<% end %>