2013-11-27 2 views
3

나는 Michael Hartl의 튜토리얼을 따라 왔고 이제는 마이크로 포스트에 사진을 추가하려고합니다. 그러나 microposts를 제출하면 이미지가 데이터베이스에 저장되지 않고 dvlpmt 로그에 다른 게시물을보고 내게 도움이되었지만 나에게 도움이되지 않습니다.허용되지 않는 매개 변수, 중첩 된 양식 - Ruby On Rails

MODELS

micropost.rb

class Micropost < ActiveRecord::Base 
    belongs_to :user 
    has_one :photo 
    default_scope -> { order('created_at DESC') } 
    validates :content, presence: true, length: { maximum: 140 } 
    validates :user_id, presence: true 
end 

photo.rb

class Photo < ActiveRecord::Base 
    belongs_to :micropost 
    has_attached_file :image 
end 

CONTROLLERS

,451,515,

photos_controller.rb

class PhotosController < ApplicationController 
    before_action :signed_in_user, only: [:create, :destroy, :index] 

    def create 
    @photo = Photo.new(photo_params) 

    respond_to do |format| 
     if @photo.save 
     format.html { redirect_to @photo, notice: 'Photo was successfully created.' } 
     format.json { render action: 'static_pages/home', status: :created, location: @photo } 
     else 
     format.html { render action: 'static_pages/home' } 
     format.json { render json: @photo.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    private 
    def photo_params 
     params.require(:photo).permit(:image) 
    end 
end 

microposts_controller.rb

class MicropostsController < ApplicationController 
    before_action :signed_in_user, only: [:create, :destroy] 

    def create 
    @micropost = current_user.microposts.build(micropost_params) 
    if @micropost.save 
     flash[:success] = "Micropost created!" 
     redirect_to root_url 
    else 
     @feed_items = [] 
     render 'static_pages/home' 
    end 
    end 

    private 

    def micropost_params 
    params.require(:micropost).permit(:content, photo_attributes: [:photo_id, :image]) 
    end 
end 

VIEWS

내가 방법을 잘 모릅니다 _micropost_form.html.erb 물론이 양식을 구축, 나는 다른 공식

<%= form_for(@micropost) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <div class="field"> 
    <%= f.text_area :content, placeholder: "Compose new micropost..." %> 
    </div> 

    <%= f.fields_for :image, :html => { :multipart => true } do |builder| %> 
    <%= f.file_field :image, :f => builder %> 
    <% end %> 

    <%= f.submit "Post", class: "btn btn-large btn-primary" %> 
<% end %> 

그리고 많이 시도했습니다 내 양식을 제출하고자 할 때, 그것은 괜찮습니다,하지만 열 "photo_id은"테이블 micropost 비어 있습니다. 그리고 사진은 데이터베이스에 저장되지 않습니다. 당신은 해결책을 찾기 위해 나를 도울 수있는 무언가를 찾아 낼 수있는 경우에

Started POST "/microposts" for 127.0.0.1 at 2013-11-27 15:06:06 +0100 
Processing by MicropostsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"u7MWO+E9jM8/g+6RwquQ7XLA3PR+ohQFAx0tmwNOfuY=", "micropost"=>{"content"=>"Hello world", "image"=>#<ActionDispatch::Http::UploadedFile:0x00000003401a48 @tempfile=#<Tempfile:/tmp/RackMultipart20131127-4010-1r6qt80>, @original_filename="paint.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"micropost[image]\"; filename=\"paint.jpg\"\r\nContent-Type: image/jpeg\r\n">}, "commit"=>"Post"} 
    [1m[36mUser Load (0.2ms)[0m [1mSELECT "users".* FROM "users" WHERE "users"."remember_token" = '342df8f039f7f40698b3691f77d2539dc8b9c101' LIMIT 1[0m 
Unpermitted parameters: image 
    [1m[35m (0.1ms)[0m begin transaction 
    [1m[36mSQL (0.4ms)[0m [1mINSERT INTO "microposts" ("content", "created_at", "updated_at", "user_id") VALUES (?, ?, ?, ?)[0m [["content", "Hello world"], ["created_at", Wed, 27 Nov 2013 14:06:06 UTC +00:00], ["updated_at", Wed, 27 Nov 2013 14:06:06 UTC +00:00], ["user_id", 101]] 
    [1m[35m (145.1ms)[0m commit transaction 
Redirected to http://localhost:3000/ 
Completed 302 Found in 153ms (ActiveRecord: 145.7ms) 
내가 완전히 지금 붙어

서버 로그, 감사합니다!

+0

'{: micropost => {: image => ...}}'와 같이 중첩 된 것처럼 보이므로,'params.require (: micropost) .permit (: content, : 이미지, ...)' –

+0

당신은 다음과 같은 것을 의미합니다 : def micropost_params params.require (: micropost) .permit (: content, photo_attributes : [: photo_id, : image, image_file_name, : image_file_size, : image_update_at)) 끝 '. : 이미지가 여전히 허용되지 않습니다 – 2ueenO

+0

이 게시물이 유용하다고 생각합니다. http://stackoverflow.com/questions/20334124/unpermitted-parameters-error-for-permitted-attributes – Evolve

답변

0

Micropost 클래스에서 accepts_nested_attributes_for을 사용해야합니다.

class Micropost < ActiveRecord::Base 
    belongs_to :user 
    has_one :photo 
    accepts_nested_attributes_for :photo 
    default_scope -> { order('created_at DESC') } 
    validates :content, presence: true, length: { maximum: 140 } 
    validates :user_id, presence: true 
end 

양식이 마이크로 포스트의 사진이 아니라 마이크로 포스트와 연결되어있는 것처럼 보입니다. fields_for에 대한 Ruby 문서를 살펴보십시오. 양식의 일부를이 부분으로 변경해볼 수 있습니까? 이렇게하면

<%= f.fields_for :photo, :html => { :multipart => true } do |photo_fields| %> 
    <%= photo_fields.file_field :image %> 
<% end %> 

, 당신은 당신이보기를 렌더링하는 컨트롤러 액션에 @micropost.build_photo 전화를 확인해야합니다.

강한 매개 변수에 photo_id을 입력해야한다고 생각하지 않습니다. microposts_controller.rb. 레코드가 데이터베이스에 저장되면 설정해야합니다.

building complex forms에서 레일 가이드를 읽을 수도 있습니다. 이 가이드에서는 중첩 된 특성을 처리하도록 모델, 뷰 및 컨트롤러를 설정하는 방법에 대해 설명합니다.strong parameters에 대한 설명은 아직 확인하지 않은 경우 확인하는 것이 좋습니다.

+0

안녕하세요. 관심을 가져 주셔서 감사합니다. 귀하의 솔루션을 시도했지만 지금은'허용되지 않은 매개 변수 : 사진'도 fields_for에 대한 doc을 읽고'accepts_nested_attributes_for : 사진 '을 추가하려했으나 이미지에 대한 양식이 사라졌습니다! – 2ueenO

+0

답을 업데이트했습니다. 모델에'accepts_nested_attributes_for'를 추가하십시오. –

+0

나는 노력하고있다. 그러나 말했듯이 'accepts_nested_attributes_for'가있을 때 그림을 업로드하는 양식이 사라진다. 나는 이유를 찾고있다. – 2ueenO

관련 문제