0

다음 양식 및 컨트롤러를 사용 중입니다. 새로운 알림을 작성하면 campus_id를 제외한 모든 정보가 저장됩니다.collection_select를 사용하는 양식, 편집 작업이 완전히 작동하지만 작성되지 않음

드롭 다운에서 다른 것을 선택했지만 잘못된 캠퍼스 매개 변수를 제공하는 것으로 보입니다. 나중에 동일한 항목을 편집하면 저장됩니까? 무슨 일이 일어나고 어떻게 해결할 수 있습니까?

동일한 양식이 편집 및 만들기 작업에 사용됩니다. (일부 임)

캠퍼스 (has_many) 및 알림 (belongs_to)에 얕은 경로를 사용한다는 점에 유의할 필요가 없습니다.

routes.rb

shallow do 
    resources :campus do 
     resources :notifications 
    end 
    end 

형태 :

<%= form_for [@campus,@notification] do |f| %> 
    <% if @notification.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@notification.errors.count, "error") %> prohibited this notification from being saved:</h2> 

     <ul> 
     <% @notification.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :post %><br> 
    <%= f.text_area :post %> 
    </div> 
    <div class="field"> 
    <%= f.label :campus %><br> 
    <%= f.collection_select(:campus_id, Campus.all.order('name ASC'), :id, :name, prompt: true) %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

이것은 컨트롤러 :

내가 잘못된 매개 변수가 comitted 것을 볼 로그를 보면
class NotificationsController < ApplicationController 
    before_action :set_notification, only: [:show, :edit, :update, :destroy] 
    before_action :set_campus, only: [:index, :new, :create] 

    def index 
    @notifications = @campus.notification 
    end 

    def show 
    end 

    def new 
    @notification = @campus.notification.new 
    end 

    def edit 
    end 

    def create 
    @notification = @campus.notification.new(notification_params) 

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

    def update 
    respond_to do |format| 
     if @notification.update(notification_params) 
     format.html { redirect_to @notification, notice: 'Notification was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: 'edit' } 
     format.json { render json: @notification.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @notification.destroy 
    respond_to do |format| 
     format.html { redirect_to campu_notifications_url(1) } 
     format.json { head :no_content } 
    end 
    end 

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

    def set_campus 
     @campus = Campus.find(params[:campu_id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def notification_params 
     params.require(:notification).permit(:post, :campus_id) 
    end 
end 

.

은 84.193.153.106은 "/ 캠퍼스/1/통지"2014년 9월 29일 18시 29분 33초 0000가 POST를 시작 에서 "/ 캠퍼스/1/통지"84.193.153.106를 들어 POST 시작 2014-09-29 18:29:33 +0000 NotificationsController로 처리 # HTML 처리로 작성 NotificationsController # HTML로 작성 매개 변수 : { "utf8"=> "_", "authenticity_token"=> "oNSlEFeukwEj2hIAT89wFdIYwjHO5c8lzBlCqMyk31Y =", "notification", "campu_id"=> "1"} "notification"=> { "post"=> "sdqfdsfd", "campus_id"=> "3"} "커밋"=> "utf8"=> "_", "authenticity_token"=> "oNSlEFeukwEj2hIAT89wFdIYwjHO5c8lzB "commit"= ""Create "Notification", "campu_id"=> "1"} ","0123, 캠퍼스로드 위치 캠퍼스로드 (0.4ms) 선택 "캠퍼스". * "캠퍼스"위치 "캠퍼스". "id"= $ 1 LIMIT 1 [[ "id", "1"] 캠퍼스로드 (0.4ms) (0.1ms)BEGIN (0.1ms) BEGIN SQL (28.6ms) INSERT INTO "이 캠퍼스에서"ID "= $ 1 LIMIT 1 [["id ","1 "]] 알림 "("campus_id ","created_at ","post ","updated_at ") VALUES ($ 1, $ 2, $ 3, $ 4)"id "[[" "campus_id", 1 ", created_at" , 2014 년 9 월 29 일 18:29:34 UTC +00 : 00], [ "post", "sdqfdsfd"], [ "updated_at", 월 9 월 29 일 2014 18:29:34 UTC +00 : 00]] SQL (28.6ms) INSERT INTO "알림"("campus_id", "created_at", "post_", updated_at ") VALUES ($ 1, $ 2, $ 3, $ 4)"id "[[" "campus_id", 1], [ "created_at", 월, 29 2014 년 9 월:29:34 UTC +00 : 00], [ "post", "sdqfdsfd"], [updated_at], 월 9 월 29 일 2014 18:29:34 UTC +00 : 00]] (3.5 밀리) (3.5ms)이

+0

모든 것이 올바르게 보입니다. 양식을 제출하는 동안 log/development.log를 살펴보십시오. 그것은 도움이 될 수 있습니다! – Rodrigo

답변

2

이처럼 newcreate 작업을 변경할 수 있습니다 COMMIT COMMIT :

def new 
    @notification = @campus.notifications.build 
end 

def create 
    @notification = @campus.notifications.build(notification_params) 

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

campus.build_notification이 있다는 통지를 인스턴스화합니다 belongs_tocampus.new을 사용하면 notification[campus_id]을 매개 변수의 일부로 전달해야합니다.

+0

시도 할 때 # 에 대해 'build_notification'메소드가 정의되지 않았습니다. – Christoph

+0

나는 @ campus.notification.build를 시도했고 나는 같은 문제를 가지고있다. – Christoph

+0

당신의 협회의 방향을 잘못 읽었습니다. '@ campus.notifications.build'가되어야합니다. – sjaime