2014-02-16 4 views
0

Ok 일부 데이터를 삽입하기 위해 서버에 JQuery. post 요청을하고 있습니다. Rails 작성 메소드에 어떤 메소드가 있는지에 따라 때로는 작동합니다.POST 메서드/Create 메서드는 일부 메서드에서는 작동하지만 다른 메서드에서는 작동하지 않습니다. Feedzirra

여기에 구체적인 내용이 나와 있습니다. 프론트 엔드에 Backbone.js가있는 Rails 앱이 있습니다. 프론트 엔드 코드에서이. post 요청을한다.

$.post('/publications'); 

충분히 간단 해 보인다. 나는 라우터에

resources :publications 

뿐만 아니라 출판 모델을 가지고 있습니다.

def create 
    feed = Feedzirra::Feed.fetch_and_parse(publication_params[:url]) 
    params = {:name => feed.title} 
    @publication = Publication.new(params) 

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

Feedzirra는 RSS 피드를 구문 분석하는 보석이다 : 이제 내 간행물 컨트롤러에서 나는 다음에 방법을 만들 증강. 나는이 같은 POST 요청을하면 내 서버 로그에서 500 (내부 서버 오류)이 메시지가

NoMethodError (undefined method `title' for {}:Hash): 
    app/controllers/publications_controller.rb:28:in `create' 


    Rendered /Users/ericabt1/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_source.erb (40.3ms) 
    Rendered /Users/ericabt1/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.1ms) 
    Rendered /Users/ericabt1/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.0ms) 
    Rendered /Users/ericabt1/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (54.7ms) 

무엇 나를 혼란 것은 그 나는 항목 '와 같은'제목 '과는 다른 방법을 선택하는 경우 '또는'nil? ' POST 요청은 잘 작동합니다. 레일즈 콘솔에 가서 테스트 Feedzirra 객체를 만들고 다양한 메서드를 사용할 때 'title'이 그 중 하나라는 것을 알았 기 때문에 'title'은 실제로 메서드라는 것을 알고 있습니다.

왜 내 POST 요청은 이러한 방법 중 일부에서 작동하지만 다른 방법은 사용할 수 없습니까?!,!,!!?!

* UPDATE * ***

krabbi을 복용하고 알렉산더 Zolotko의 조언 내가 FeedZirra가 반환하는 것과 함께 연주하기 시작 후. 줄처럼 보입니다.

feed = Feedzirra::Feed.fetch_and_parse(publication_params[:url]) 

이 빈 해시를 반환합니다.

레일즈 콘솔에서 같은 줄을 실행하고 URL을 하드 코드하면 적절한 해시가 반환되고 제목과 다른 값을 가져올 수 있습니다. 문제가

publication_params[:url] 

아직도 제안 :

* UPDATE 두번째 부분 *

이 오픈 작업에있다처럼 그래서 내가 문제가 더 URL가 없다고라고 생각 보인다 열을 선택합니다. 그래서 나는 적절한 이주를했다. 맨 위로 하단에있는 컨트롤러에

create_table "publications", force: true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "url" 
    end 

:

private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_publication 
     @publication = Publication.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def publication_params 
     params.permit(:name, :url) 
    end 

publication_params [: 홈페이지] 여전히 전무를 반환 그래서 여기 스키마입니다.

params.require(:publication).permit(:url, :name) 

당신의 publication_params[:url]이 문자열 이외가 포함되어있는 Feedzirra::Feed.fetch_and_parse 내가 볼 수있는 유일한 옵션을 검토 한 후 나에게 400 잘못된 요청 오류

답변

0

Alexander Zolotko가 지적한대로 Feedzirra::Feed.fetch_and_parse은 해시를 반환합니다. 프론트 엔드를 가정하면 예를

params = { :name => feed[:title] } 

에 대한

봅니다 정확하고 REST 자원 출판물이 제대로 레일 백엔드에 설정되어 있습니다. 내가해도 그게 좋은 방법이 아닙니다 작동하는지 확신합니다

def create 
    # requesting the feed from passed url 
    feed = Feedzirra::Feed.fetch_and_parse(publication_params[:url]) 

    # mapping feed keys to publication attributes 
    feed_to_publication_hash = { :name => feed[:title], anything else } 

    # instantiating new publication 
    @publication = Publication.new(publication_params.merge(feed_to_publication_hash)) 
    ... 
end 

private 

def publication_params 
    params.require(:publication).permit(:url, everything else you need) 
end 

: 같은

컨트롤러는 예를 들어 보일 것입니다. 일반적으로 당신은 객체 지향에 대한 투쟁, 즉이 경우 액션 당 하나의 목적입니다.

하지만 피드를 리퍼러하여 아마도 해시를 매핑하는 방법을 지금 당장 모르겠습니다. 어쩌면 그것은 컨트롤러와 관련된 것일 수도 있습니다.

+0

이로 인해 더 이상 500 오류가 발생하지 않았습니다. 새로운 발행물 항목을 만들었지 만 이름 열에는 아무 것도 포함하지 않았습니다. – user2623706

+0

Rails 4의 강력한 매개 변수를 사용한다고 가정하면 params 해시에서 URL을 필요로하고 허용하는지 확인하십시오. – krabbi

+0

이것은 내가 가지고있는 것입니다 : 'params.permit (: url, : name)' – user2623706

0

을 제공합니다 : 나는 또한 라인을 시도했다. 이 경우 fetch_and_parse는 하나의 URL 만 전달 된 경우에도 결과의 해시를 반환합니다. publication_params[:url].is_a?(String)이 맞는지 확인하십시오.

+0

false를 반환합니다. String 대신 NilClass에 대해 동일한 테스트를 수행했을 때 사실로 돌아 왔습니다. – user2623706