2014-10-23 1 views
0

У меня есть переменная сеанса (user_id), которую я хотел бы включить в качестве внешнего ключа в записи, которую пользователь вставляет. У меня есть значения формы, которые проходят через форму, передаются в метод entity.update (params) моего контроллера без проблем, используя определение параметров по умолчанию. Этот код выглядитRails - ActionController :: Параметры включают значение контроллера с значениями формы

def brand_params 
    @brand_params = params.require(:brand).permit(:name, :brand_type, :profile_id) 
    end 

Метод обновления выглядит

if @brand.update(brand_params) 
     format.html { redirect_to @brand, notice: 'Widget was successfully updated.' } 
     format.json { render :show, status: :ok, location: @brand } 
     else 
     format.html { render :edit } 
     format.json { render json: @brand.errors, status: :unprocessable_entity } 
     end 

Теперь я хотел бы добавить в: profile_id переменную сеанса в @brand_params и после других потоков здесь, я попробовал метод сеттера:

def set_brand_params(key, val) 
    if @brand_params != nil 
     @brand_params[key] = val 
    end 
    end 

Однако, называя это, @brand_params всегда равен нулю. Попытка напрямую добавить к хешу brand_params не работает, потому что это лучший метод. Если есть лучший способ встретить это (я бы предположил, общий) случай использования, я все уши! В противном случае я хотел бы знать, почему var всегда ноль, хотя в этом контексте, по крайней мере, метод brand_params считает его определенным и со значением. Я получил это решение в Adding a value to ActionController::Parameters on the server side

Вот метод обновления по запросу:

def update 
    puts "update" 
    set_brand_params("profile_id", session[:prof]) 
    respond_to do |format| 
     if @brand.update(brand_params) 
     format.html { redirect_to @brand, notice: 'Widget was successfully updated.' } 
     format.json { render :show, status: :ok, location: @brand } 
     else 
     format.html { render :edit } 
     format.json { render json: @brand.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
+0

Если вы используете 'set_brand_parmas' перед любым вызовом' brand_params' да, @brand_params не определен (ноль). –

+0

Да, если я переместил переменную @brand_params в конструктор (здесь new()), это не ноль, так что это ответ! Я до сих пор неясно, насколько лучше, потому что теперь этот защищенный var является общедоступным ... но достаточно хорошим. –

+0

Не могли бы вы отредактировать вопрос и добавить обновление всего метода? –

ответ

0

Я не согласен с слияния данных с Params. Потому что вы должны разрешать только поля, которые ожидают обновления вашего пользователя. В этом случае вы не хотите, чтобы пользователь обновлял profile_id на торговых марках, и это лучшая практика безопасности.

Тогда brand_params должно быть:

def brand_params 
    @brand_params = params.require(:brand).permit(:name, :brand_type) 
end 

Ваше обновление метод может выглядеть этим:

def update 
    @brand = Brand.find(params[:id]) 
    @brand.assign_attributes(profile_id: session[:prof]) 
    respond_to do |format| 
    if @barnd.update(brand_params) 
     format.html { redirect_to @brand, notice: 'Widget was successfully updated.'} 
     format.json { render :show, status: :ok, location: @brand } 
    else 
     format.html { render :edit } 
     format.json { render json: @brand.errors, status: :unprocessable_entity } 
    end 
    end 
end 

Вам не нужно метод set_brand_params вообще.

Если это не делает трюк, пожалуйста, опубликуйте контроллер ввода, и я надеюсь, что мы найдем проблему.

изменить: добавить reply_to.

+0

После того, как я увидел ваш код, я предполагаю, что у вас есть до_фильтр или before_action на вашем контроллере, и он устанавливает переменную @brand, как и в начале моего метода обновления. В этом случае замените метод set_brand_params на '@ brand.assign_attributes (profile_id: session [: prof])' –

+0

Да, @Alejandro, это сработало. Используя assign_attributes и удаляя из params, это намного безопаснее. Благодаря! –